重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
10年积累的成都做网站、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先做网站设计后付款的网站建设流程,更有南谯免费网站建设让你可以放心的选择与我们合作。
该教程是讨论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];