0

我想知道是否有人可以告诉我首先创建一个局部变量的好处,而不是直接初始化一个存储的变量。请参见下面的示例:

例子.h

NSString *exampleString;

@property (nonatomic, retain) NSString *exampleString;

例子.m

@synthesize exampleString;

方法一(直接初始化)

self.exampleString = [NSString stringWithString:@"Example"];

方法二(本地初始化)

NSString *example = [NSString stringWithString:@"Example"];
self.exampleString = example;
[example release];

我在我的代码中使用了这两种类型,但没有注意到任何直接的区别,但是当我查看大多数编码示例时,它们使用方法 2。我只是想知道两者之间是否存在实际差异?

提前致谢,埃利奥特

4

3 回答 3

1

对于您只使用一次的情况,我想不出任何办法。事实上,你的例子指出了一个问题,如果它存在,有人可能会试图过度释放它。:)

实际上,self.exampleString = @"Example";比它们中的任何一个都更容易阅读。

于 2012-05-14T13:58:29.597 回答
0

第二种方法是错误的!您正在释放一个已经自动释放的对象。您不拥有示例字符串,因为您没有调用 init 或 retain。然后你不需要释放它,否则它可能会使你的应用程序崩溃。第二种方法的正确版本是:

NSString *example = [[NSString alloc] initWithString:@"Example"];
self.exampleString = example;
[example release];

这与您的第一种方法之间的区别在于,在这里您没有自动释放的对象。您初始化一个字符串,将其分配(并保留)给您的实例变量,然后释放它。在第一个方法中,stringWithString 将创建一个自动释放的对象,该对象将在未来的某个时间(通常在循环结束时)释放。在那之前它在内存中(并浪费它)。所以特别是对于(很多)大物体,你应该避免这种情况。

于 2012-05-14T13:56:09.447 回答
0

在方法 2 中,您不应该释放example变量,因为您没有创建它也没有保留它。看看这个: https ://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

除了这个问题,你的两种方法没有区别。在我看来,方法 1 更简洁,因为您不需要那个额外的变量。

于 2012-05-14T13:55:27.010 回答