NSNumber的@property属性?

时间:2009-11-13 19:09:16

标签: objective-c cocoa

在下面我是否正确(记住NSNumber是一个对象)使用赋值给NSNumber?

@property(assign) NSNumber *mass;

另外,如果我使用retain,我需要添加一个版本,但如果我用一个alloc创建NSNumber,我不需要发布两次,一次是retain,一次是alloc?

@property(retain) NSNumber *mass;
mass = [[NSNumber alloc] numberWithInt:5];

加里

4 个答案:

答案 0 :(得分:5)

您通常希望retain您的实例变量,因此它们不会意外地消失。你的行:

mass = [[NSNumber alloc] numberWithInt:5];

有点奇怪。你可能想要其中一个:

mass = [NSNumber numberWithInt:5];
mass = [[NSNumber alloc] initWithInt:5];

第一个给你一个自动释放的NSNumber对象,第二个给你一个NSNumber一个被保留的对象。我期待你真正想要的是:

@property(retain) NSNumber *mass;
self.mass = [NSNumber numberWithInt:5];

答案 1 :(得分:2)

您的困惑源于两个独立的概念:Objective-C 2.0属性和内存管理。

是否使用assign或retain完全取决于您正在尝试做什么以及您是否正在使用垃圾收集。例如,如果您没有使用垃圾收集,并且您使用的是分配,那么将质量设置为[NSNumber numberWithInt:0],您的(自动释放的)NSNumber实例将会消失,下次您遇到问题试图使用它。

关于第二个代码块中需要多少个版本,您确实需要(重新)阅读内存管理文档。如果您创建了对象(通过文档中提到的方法),则您负责释放它。而已。无论其他东西是否保留,都是“没有你的事”。因此,遵循这一逻辑,如果您的大众财产保留(并正确释放)其价值(如果您使用@synthesize或遵循适当的访问者设置者示例,它将会正常处理它自己的业务)。同样,如果您创建对象,则您负责释放它。其他人可能会根据需要保留/释放对象,但这超出了您的考虑范围。

另外,[[NSNumber alloc] numberWithInt:5]错了。你分配/初始化...但你没有分配,然后调用一个方便的方法(可能会分配/初始化一个实例本身)。

答案 2 :(得分:0)

你可以使用assign,但是你需要注意其他一些类需要保留它,并且在发布NSNumber对象时,交给它的类需要将它设置为nil。

如果你把它作为一个retain属性,你可以编写以下内容,让属性的retainCount为1:

self.mass = [NSNumber numberWithInt:5];

mass = [[NSNumber alloc] initWithInt:5]; 
// no "self." also note that the message is "init..."

NSNumber *num = [[NSNumber alloc] initWithInt:5];
self.mass = num;
[num release];

如果通过“实例”设置,则设置retain-property只会增加retainCount。或“自我”。

答案 3 :(得分:0)

NSNumber和其他不可变对象应该是@property(retain) NSNumber *mass;(可变对象应该使用副本)

分配使用self.mass = [NSNumber numberWithInt:5];

。由于该方法不包含new,copy,init,因此它返回一个自动释放的对象。使用self.将调用setter并保留值。

阅读Memory management rules