iOS 切换到MRC环境下打印 retainCount 始终是-1或者一长串证书

来源:互联网 发布:雅可比矩阵公式 编辑:程序博客网 时间:2024/04/28 04:25

根据苹果的官方文档https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html

上面写着应该返回的是这个对象的UINT_MAX, 并且不会释放, 这个UINT_MAX

最大二进制为(11111111111111111111111111111111)也是十六进制(0xffffffff)
如果你当成有符号数取补码后输出就得-1;
如果你当成无符号数就是最大数即:4294967295


2.在X64的机器上输出是9223372036854775807,int的最大值  在I386的机器上输出是2.因为NSNumber的numberWithInteger产生的对象是属于autorelease pool

在帮助文档中

可以看到这么一句话:

The retainCount method does not account for any pending autorelease messages send to the receiver.

就是说retainCount 对于autorelease消息产生的的对象,并不可靠。


3.Do not use this method. (required) You should never use-retainCount, because it never tells you anything useful. 永远不要用这个方法,只要遵守alloc,neworcopy以及任何需要分配内存的时候调用release就可以了

参考文档:


http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/。

4.iOS中的 NSString  NSArray 这种iOS自身的对象貌似都做了一些优化,打印其retainCount的数值都是-1这种情况。
但是我们自己创建一个类
eg:Test.h  
用它来创建的对象是完全和我们之前理解的retainCount预期值是相同的。

    NSString *string = [[NSString alloc] init];

    [string retain];

    NSLog(@"string = %ld", (unsigned long)[string retainCount]);

    NSLog(@"string = %lu", (unsigned long)[string retainCount]);


    NSString *string2 = [[NSString alloc] initWithString:@"123"];

    NSLog(@"string2 = %ld", (unsigned long)[string2 retainCount]);

    NSLog(@"string2 = %lu", (unsigned long)[string2 retainCount]);

    

    NSString *string3 = [NSString string];

    NSLog(@"string3 = %ld", (unsigned long)[string3 retainCount]);

    NSLog(@"string3 = %lu", (unsigned long)[string3 retainCount]);

    

    NSString *string4 = [NSString stringWithFormat:@"123%@",@"123"];

    NSLog(@"string4 = %ld", (unsigned long)[string4 retainCount]);

    NSLog(@"string4 = %lu", (unsigned long)[string4 retainCount]);

    

    Test *test = [[Test alloc] init];

    [test retain];

    [test release];

    NSLog(@"test = %lu", (unsigned long)[test retainCount]);


以上代码的打印:

2016-12-20 17:29:17.103 acm[40218:510858] string = -1

2016-12-20 17:29:17.103 acm[40218:510858] string = 18446744073709551615

2016-12-20 17:29:17.103 acm[40218:510858] string2 = -1

2016-12-20 17:29:17.103 acm[40218:510858] string2 = 18446744073709551615

2016-12-20 17:29:17.104 acm[40218:510858] string3 = -1

2016-12-20 17:29:17.104 acm[40218:510858] string3 = 18446744073709551615

2016-12-20 17:29:17.104 acm[40218:510858] string4 = -1

2016-12-20 17:29:17.104 acm[40218:510858] string4 = 18446744073709551615

2016-12-20 17:29:17.104 acm[40218:510858] test = 1



0 0
原创粉丝点击