该教程是讨论IOS平台上内存管理规则之外的一些特殊情况,我相信大部分的开发人员可能都没有觉察到。
我们先普及一下Objectivie-C中的内存管理的基本知识,如果你已经比较熟悉了,可以直接跳过该节。Objective-C使用的是引用计数(Reference Counting),引用计数就是对象用一个变量来保存有几个地方(类、方法等)在使用它。当一个对象被创造出来时,它的引用计数(下面我们用retainCount来表示这个值)为1,在应用程序运行的过程中,可能有很多地方都用到了这个对象,凡是用到这个对象时,就将它的retainCount加1,当不用了时,再将其retainCount减1,当对象的retainCount为0时,表示没有人在用这个对象了,系统就会释放这个对象所占用的内存。
NSString *emptyStr = [NSString new]; NSLog(@"emptyStr retainCount: %u", emptyStr.retainCount);
NSString *emptyStr1 = [NSString new]; NSString *emptyStr2 = [NSString new]; NSLog(@"emptyStr1 address: %p", emptyStr1); NSLog(@"emptyStr2 address: %p", emptyStr2); NSLog(@"emptyStr1 retainCount: %u", emptyStr1.retainCount); NSLog(@"emptyStr2 retainCount: %u", emptyStr2.retainCount);
NSString *nonEmptyStr1 = @"Hello"; NSString *nonEmptyStr2 = [[NSString alloc] initWithString:@"Hello"]; NSString *nonEmptyStr3 = [[NSString alloc] initWithFormat:@"%@", @"Hello"]; NSLog(@"nonEmptyStr1 address: %p", nonEmptyStr1); NSLog(@"nonEmptyStr2 address: %p", nonEmptyStr2); NSLog(@"nonEmptyStr3 address: %p", nonEmptyStr3); NSLog(@"nonEmptyStr1 retainCount: %u", nonEmptyStr1.retainCount); NSLog(@"nonEmptyStr2 retainCount: %u", nonEmptyStr2.retainCount); NSLog(@"nonEmptyStr3 retainCount: %u", nonEmptyStr3.retainCount);
NSArray *emptyArray1 = [[NSArray alloc] init]; NSArray *emptyArray2 = [[NSArray alloc] init]; NSArray *emptyArray3 = [[NSArray alloc] initWithArray:emptyArray1]; NSLog(@"emptyArray1 address: %p", emptyArray1); NSLog(@"emptyArray2 address: %p", emptyArray2); NSLog(@"emptyArray3 address: %p", emptyArray3); NSLog(@"emptyArray1 retainCount: %d", emptyArray1.retainCount); NSLog(@"emptyArray2 retainCount: %d", emptyArray2.retainCount); NSLog(@"emptyArray3 retainCount: %d", emptyArray3.retainCount); NSArray *nonEmptyArray1 = [[NSArray alloc] initWithObjects:@"1", @"2", nil]; NSArray *nonEmptyArray2 = [[NSArray alloc] initWithObjects:@"1", @"2", nil]; NSLog(@"nonEmptyArray1 address: %p", nonEmptyArray1); NSLog(@"nonEmptyArray2 address: %p", nonEmptyArray2); NSLog(@"nonEmptyArray1 retainCount: %d", nonEmptyArray1.retainCount); NSLog(@"nonEmptyArray2 retainCount: %d", nonEmptyArray2.retainCount); NSDictionary *emptyDict1 = [[NSDictionary alloc] init]; NSDictionary *emptyDict2 = [[NSDictionary alloc] init]; NSLog(@"emptyDict1 address: %p", emptyDict1); NSLog(@"emptyDict2 address: %p", emptyDict2); NSLog(@"emptyDict1 retainCount: %d", emptyDict1.retainCount); NSLog(@"emptyDict2 retainCount: %d", emptyDict2.retainCount);
NSString *s1 = [NSString new]; NSString *s2 = [NSString alloc] initWithString:@"Hello"]; NSArray *a = [NSArray alloc] init]; NSDictionary *dict = [NSDictionary alloc] init];
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。