该教程是讨论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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。