现在我盯着下面的例程看了一天,但我无法掌握它。我有一个这样的类:
MyClass.h
...
@interface MyClass : NSObject {
NSNumber *myNumber1;
NSNumber *myNumber2;
}
@property (nonatomic, retain) NSNumber *myNumber1;
@property (nonatomic, retain) NSNumber *myNumber2;
@end和m文件
#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分配初始化];
怪胎>>>的===>>>
运行这个例程,我得到了以下分面控制台输出:
Retain Counts (before) - myNumber1: 0, myNumber2: 0
Retain Counts (after) - myNumber1: 1, myNumber2: 26这怎么可能呢?
发布于 2010-07-06 03:10:28
如果这是你的实际代码,它应该根本不会工作,它应该只是崩溃。如果没有,你应该剪切并粘贴你的实际代码。
然而,有几件事。
首先,如果你像其他东西一样使用NSNumber作为ivar,你必须取得它的所有权。如果您计划使用方便的构造函数,则必须使用self上的属性为其赋值,或者向其发送显式保留消息。
其次,您输入了类似initWithInt的内容: here。如果你真的在使用这条消息,那么你从一开始就没有实际分配过这个号码。您必须将其替换为以下内容之一:
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无论您选择怎样做,您都必须在某些时候取得对象的所有权。
发布于 2010-07-06 04:38:01
不要调用retainCount
只有在您编写的类的实例上调用retainCount的返回值,并且您从未将该实例传递给系统提供的任何 API时,才能认为它是准确的。
绝对保留计数是您可能无法控制的实现详细信息。
目前,假设您的代码是键入的,因此,错误并不真正存在于您的原始代码中……
NSNumber缓存了常用值的子集。也就是说,对于某些数值,对于所有检索包装该数字的NSNumber实例的请求,都会返回一个NSNumber实例。
发布于 2010-07-06 03:17:58
您甚至不应该查看retainCount,因为它的意义并不大。您看到26的原因是,在框架中的某个地方(甚至在您自己的应用程序中),可能存在使用相同int 2创建的其他NSNumber实例。NSNumber是不可变的,因此作为优化,NSNumber可能只返回它之前创建的一个实例。只要你不看retainCount,这对你来说无关紧要。
https://stackoverflow.com/questions/3181612
复制相似问题