在下面我是否正确(记住NSNumber是一个对象)使用赋值给NSNumber?
@property(assign) NSNumber *mass;
另外,如果我使用retain,我需要添加一个版本,但如果我用一个alloc创建NSNumber,我不需要发布两次,一次是retain,一次是alloc?
@property(retain) NSNumber *mass;
mass = [[NSNumber alloc] numberWithInt:5];
加里
答案 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并保留值。