哪种方式是使用属性分配内存的正确方法?

时间:2011-09-12 23:34:46

标签: iphone objective-c cocoa-touch cocoa ipad

哪种方式正确?

NSString *c = [[NSString alloc] init];
self.character = c;
[c release];

self.character = [[NSString alloc] init];

为什么?感谢。

4 个答案:

答案 0 :(得分:4)

这取决于您的财产的申报方式。如果您使用

@property (nonatomic, retain) NSString *someString;

将创建setter以保留someString,在这种情况下,正确的方法是您的第一个方法。如果您使用:

@property (nonatomic, assign) NSString *someString;

你的第二种方法是正确的,因为它只是指定指针而不保留任何东西。

答案 1 :(得分:3)

这取决于您如何定义您的财产。

如果是copyretain,则合成的设置器(示例中为setCharacter:)将获取您分配给该属性的任何对象的所有权。在这种情况下你的第一个例子是正确的。第二个会导致内存泄漏,因为您已经声明了NSString两次的所有权,并且您(可能)只会放弃一次所有权;因此,记忆永远无法回收。

如果它是assign,另一方面,setter不会做任何特别的事情,你的第二个例子是正确的。如果您尝试对EXC_BAD_ACCESS执行任何操作,则第一个会导致NSString错误。我应该注意到,您通常只对原始类型和委托使用assign

我建议您阅读Objective-C编程语言指南的Memory Management Programming GuideDeclared 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。