NSString和其他对象类型不同?

时间:2013-04-08 13:10:46

标签: objective-c nsstring

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

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

你能猜出结果吗?天啊,这是“1 -1”!那很奇怪!

2 个答案:

答案 0 :(得分:2)

首先关闭... when should you use retain count?

永远不要使用retainCount

...其次

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

答案 1 :(得分:-1)

这里重点是你分配的任何字符串和init表单将返回相同的对象。它与创建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]开头,因为init可以在null字符串或NULL对象的情况下改变self。