【问题标题】:@property attribute for NSNumber?NSNumber 的@property 属性?
【发布时间】:2009-11-13 19:09:16
【问题描述】:

在下面我是否正确(记住 NSNumber 是一个对象)将 assign 与 NSNumber 一起使用?

@property(assign) NSNumber *mass;

另外,如果我使用了 retain,我需要添加一个 release,但如果我使用 alloc 创建 NSNumber,我不需要释放两次,一次用于 retain,一次用于 alloc?

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

加里

【问题讨论】:

  • 首先感谢cmets,你说得对,numberWithInt 和alloc 是错误的,我只是凭记忆写的,弄乱了语法。

标签: objective-c cocoa


【解决方案1】:

您通常希望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];

【讨论】:

  • 嘿-刚刚发布了我自己的看法。我认为重要的是要指出 [[NSNumber alloc] numberWithInt:5] 不仅“奇怪”,而且是完全错误的。
  • 我有点希望这是一个复制/粘贴/重写堆栈溢出问题,而不是真正的代码。你是对的,它是错的;我想知道它是否甚至可以编译?
  • 答案是肯定的,它可以编译,在我的测试中甚至没有警告。它在运行时因 NSInvalidArgumentException 而崩溃。
【解决方案2】:

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

是否使用分配或保留完全取决于您要执行的操作以及您是否使用垃圾收集。例如,如果您没有使用垃圾收集,而您使用的是assign,则将质量设置为[NSNumber numberWithInt:0],您的(自动释放的)NSNumber 实例将消失,下次您尝试使用它时会遇到问题.

关于第二个代码块中需要多少个版本,您确实需要(重新)阅读内存管理文档。如果您创建了对象(通过文档中提到的方法),您有责任释放它。就是这样。其他东西是否保留它“不关你的事”。因此,按照这个逻辑,如果你的 mass 属性保留(并正确释放)它的值(如果你使用 @synthesize 或遵循正确的访问器设置器示例,它会很好地处理自己的业务。同样,如果您创建对象,则您有责任释放它。其他人可能会根据需要保留/释放该对象,但这不在您的考虑范围内。

另外,[[NSNumber alloc] numberWithInt:5] 是错误的。你分配/初始化...但你不分配,然后调用一个方便的方法(大概会分配/初始化...一个实例本身)。

【讨论】:

  • 谢谢 Joshua,我正在第二次阅读内存管理指南,但是对于 Objective-C 和 Cocoa 的新手来说,需要一点时间才能深入了解。非常感谢您的明确回答,我会的根据我现在的情况,再读一次以刷新我的知识。
  • 很难克服最初的困难。但是,一旦你“得到它”,在大多数情况下它都会变得容易。
  • 另外,numberWithInt:是一个类方法;将该消息发送到alloc 的结果就是将它发送到一个instance
【解决方案3】:

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

如果您将其设为保留属性,您可以编写以下内容,使该属性的 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];

设置保留属性只会增加通过“实例”设置的保留计数。或“自我”。

【讨论】:

  • 同样适用于所有对象也记得在“self”的dealloc方法中释放质量
【解决方案4】:

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

分配时使用self.mass = [NSNumber numberWithInt:5];。由于该方法不包含 new、copy、init,因此它返回一个自动释放的对象。使用self. 将调用setter 并保留值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多