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