-3
NSObject * obj1 = [[NSObject alloc] init];
NSLog(@"%d", [obj1 retainCount]);

NSString * string1 = [[NSString alloc] init];
NSLog(@"%d", [string1 retainCount]);

你能猜出结果吗?哦,我的上帝,它是“1 -1”!那奇怪!

4

2 回答 2

1

首先...什么时候应该使用保留计数?

从不使用retainCount

第二...

不,这并不奇怪,因为您正在查看一个永远不会被释放的字符串文字。

于 2013-04-08T13:14:26.870 回答
-1

这里重要的一点是,您分配和初始化该表单的任何字符串都将返回相同的对象。这与创建 NSNull 相同。空字符串是一个常量,并且始终是同一个对象。

尝试这个:

NSString * string1 = [[NSString alloc] init] ;
NSLog(@"%d %u", [string1 retainCount], string1);

NSString * string2 = [[NSString alloc] init];
NSLog(@"%d %u", [string2 retainCount], string2);

NSNull * theNULL = [NSNull null];
NSLog(@"%d %u", [theNULL retainCount], theNULL);

NSNull * theNULL2 = [[NSNull alloc] init];
NSLog(@"%d %u", [theNULL2 retainCount], theNULL2);

string1 和 string2 是相同的值,所以都指向空字符串。两个 NSNull 相同。

这种行为解释了为什么每个 init 方法都以 self=[super init] 开头,因为在 null 字符串或 NULL 对象等情况下,init 可以更改 self。

于 2013-04-08T13:28:07.930 回答