NSObject * obj1 = [[NSObject alloc] init];
NSLog(@"%d", [obj1 retainCount]);
NSString * string1 = [[NSString alloc] init];
NSLog(@"%d", [string1 retainCount]);
你能猜出结果吗?哦,我的上帝,它是“1 -1”!那奇怪!
NSObject * obj1 = [[NSObject alloc] init];
NSLog(@"%d", [obj1 retainCount]);
NSString * string1 = [[NSString alloc] init];
NSLog(@"%d", [string1 retainCount]);
你能猜出结果吗?哦,我的上帝,它是“1 -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。