首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSNumber怪胎...?

NSNumber怪胎...?
EN

Stack Overflow用户
提问于 2010-07-06 02:54:30
回答 3查看 162关注 0票数 0

现在我盯着下面的例程看了一天,但我无法掌握它。我有一个这样的类:

MyClass.h

代码语言:javascript
复制
...
@interface MyClass : NSObject {
    NSNumber *myNumber1;
    NSNumber *myNumber2;
}

@property (nonatomic, retain) NSNumber *myNumber1;
@property (nonatomic, retain) NSNumber *myNumber2;

@end

和m文件

代码语言:javascript
复制
#import "MyClass.h"
@synthesize myNumber1, myNumber2; 
@implementation MyClass

-(id) init {
    self = [super init];

    NSLog(@"Retain Counts myNumber1: %d, myNumber2: %d", [myNumber1 retainCount], [myNumber2 retainCount]);

    myNumber1 = [NSNumber inbitWithint:10];
    myNumber2 = [NSNumber inbitWithint:2];

    NSLog(@"Retain Counts myNumber1: %d, myNumber2: %d", [myNumber1 retainCount], [myNumber2 retainCount]);

    return self;
}
...

我将这个类用作全局容器,并在应用程序中使用

MyClass *myGlobals = [MyClass分配初始化];

怪胎>>>的===>>>

运行这个例程,我得到了以下分面控制台输出:

代码语言:javascript
复制
Retain Counts (before) - myNumber1: 0, myNumber2: 0
Retain Counts (after)  - myNumber1: 1, myNumber2: 26

这怎么可能呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-06 03:10:28

如果这是你的实际代码,它应该根本不会工作,它应该只是崩溃。如果没有,你应该剪切并粘贴你的实际代码。

然而,有几件事。

首先,如果你像其他东西一样使用NSNumber作为ivar,你必须取得它的所有权。如果您计划使用方便的构造函数,则必须使用self上的属性为其赋值,或者向其发送显式保留消息。

其次,您输入了类似initWithInt的内容: here。如果你真的在使用这条消息,那么你从一开始就没有实际分配过这个号码。您必须将其替换为以下内容之一:

代码语言:javascript
复制
myNumber1 = [[NSNumber alloc] initWithInt:10]; // explicitly create the number
myNumber1 = [[NSNumber numberWithInt:10] retain]; // take ownership through retain
[self setMyNumber1:[NSNumber numberWithInt:10]]; // use the property accessors to deal with ownership and the convenience constructor to create the number

无论您选择怎样做,您都必须在某些时候取得对象的所有权。

票数 2
EN

Stack Overflow用户

发布于 2010-07-06 04:38:01

不要调用retainCount

只有在您编写的类的实例上调用retainCount的返回值,并且您从未将该实例传递给系统提供的任何 API时,才能认为它是准确的。

绝对保留计数是您可能无法控制的实现详细信息。

目前,假设您的代码是键入的,因此,错误并不真正存在于您的原始代码中……

NSNumber缓存了常用值的子集。也就是说,对于某些数值,对于所有检索包装该数字的NSNumber实例的请求,都会返回一个NSNumber实例。

票数 3
EN

Stack Overflow用户

发布于 2010-07-06 03:17:58

您甚至不应该查看retainCount,因为它的意义并不大。您看到26的原因是,在框架中的某个地方(甚至在您自己的应用程序中),可能存在使用相同int 2创建的其他NSNumber实例。NSNumber是不可变的,因此作为优化,NSNumber可能只返回它之前创建的一个实例。只要你不看retainCount,这对你来说无关紧要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3181612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档