我想知道是否有人能告诉我首先创建局部变量的好处,而不是直接初始化存储的变量。见下面的例子:
example.h文件
NSString *exampleString;
@property (nonatomic, retain) NSString *exampleString;
Example.m
@synthesize exampleString;
方法1(直接初始化)
self.exampleString = [NSString stringWithString:@"Example"];
方法2(本地初始化)
NSString *example = [NSString stringWithString:@"Example"];
self.exampleString = example;
[example release];
我在我的代码中使用了这两种类型,但是没有注意到任何直接的差异,但是当我查看大多数编码示例时,他们使用方法2.我只是想知道两者之间是否存在实际差异?
先谢谢了, 埃利奥特
答案 0 :(得分:1)
对于你只使用过一次的情况,我想不出来。事实上,你的例子指出了一个问题,如果它存在,有人可能会试图过度释放它。 :)
实际上,self.exampleString = @"Example";
比其中任何一个都更容易阅读。
答案 1 :(得分:0)
在方法2中,您不应释放example
变量,因为您没有创建它也不保留它。看看这个:
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html
除了这个问题,两种方法之间没有区别。在我看来,方法1更清晰,因为你不需要额外的变量。
答案 2 :(得分:0)
第二种方法错了!您正在发布已经自动释放的对象。您没有示例字符串,因为您没有调用init或retain。然后你不需要发布它,否则它可能会使你的应用程序崩溃。第二种方法的正确版本是:
NSString *example = [[NSString alloc] initWithString:@"Example"];
self.exampleString = example;
[example release];
这和你的第一个方法的区别在于,你没有自动释放的对象。初始化一个字符串,将其分配(并保留)到您的实例变量,然后释放它。在第一个方法中,stringWithString将创建一个自动释放的对象,该对象将在未来的某个时间释放(通常在循环结束时)。在那之前,它是在记忆中(并浪费它)。特别是对于(很多)大型物体,你应该避免这种情况。