哪种方式正确?
NSString *c = [[NSString alloc] init];
self.character = c;
[c release];
或
self.character = [[NSString alloc] init];
为什么?感谢。
答案 0 :(得分:4)
这取决于您的财产的申报方式。如果您使用
@property (nonatomic, retain) NSString *someString;
将创建setter以保留someString,在这种情况下,正确的方法是您的第一个方法。如果您使用:
@property (nonatomic, assign) NSString *someString;
你的第二种方法是正确的,因为它只是指定指针而不保留任何东西。
答案 1 :(得分:3)
这取决于您如何定义您的财产。
如果是copy
或retain
,则合成的设置器(示例中为setCharacter:
)将获取您分配给该属性的任何对象的所有权。在这种情况下你的第一个例子是正确的。第二个会导致内存泄漏,因为您已经声明了NSString
两次的所有权,并且您(可能)只会放弃一次所有权;因此,记忆永远无法回收。
如果它是assign
,另一方面,setter不会做任何特别的事情,你的第二个例子是正确的。如果您尝试对EXC_BAD_ACCESS
执行任何操作,则第一个会导致NSString
错误。我应该注意到,您通常只对原始类型和委托使用assign
。
我建议您阅读Objective-C编程语言指南的Memory Management Programming Guide和Declared Properties部分。
答案 2 :(得分:1)
答案取决于您的@property
定义。对于(retain)
,可能类似于(copy)
或NSString
。在这种情况下,分配给self.character会增加保留计数。所以底部:
self.character = [[NSString alloc] init];
你已经使用alloc将self计数设置为1,而self.character也会将其保留为2,因此会泄漏。应该是
self.character = [[[NSString alloc] init] autorelease];
或顶级版本。
答案 3 :(得分:0)
iOS 5的答案就是使用ARC。