第一题
定义两个类,借用retainCount和dealloc方法测试以下内存管理方法:
alloc、retain、copy、release、autorelease。
内存管理的方式分为:MRC(手动)和ARC(自动)。
使用alloc、retain、copy引用计数(retainCount)加一
使用release引用计数(retainCount)立即减一
使用autorelease引用计数(retainCount)在@autoreleasepool{}结束后减一
如果定义便利构造器如下:
/// 便利构造器
+ (id)personWithName:(NSString *)name
{
return [[[Person alloc] initWithName:name] autorelease];
}
这里使用了alloc申请,autorelease释放,在主函数里就不用再释放对象所申请的空间。
在主函数里如果alloc或retain或copy一个对象空间,就必须有对应的release或者autorelease进行释放。
主函数main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p1 = [Person personWithName:@"明明"];
Person *p2 = [Person personWithName:@"菲菲"];
NSLog(@"%lu", [p1 retainCount]); // p1申请alloc一个内存,引用计数加一
Person *p3 = [p2 retain]; // 给p3分配钥匙,p3和p2一同指向p2的对象
NSLog(@"%lu", [p3 retainCount]); // p3引用计数为2,因为p2和p3一共两个
[p3 release]; // 释放p2的内存
p2 = nil; // p2置空,防止p2成为野指针
NSLog(@"%lu", [p2 retainCount]); // p2为空,引用计数为零
NSLog(@"%lu", [p3 retainCount]); // p3的引用计数减一
Person *p4 = [p1 copy]; // p4复制p1
[p4 autorelease]; // 释放p4
Student *s1 = [Student studentWithName:@"楠楠" school:@"蓝欧"];
NSLog(@"%lu", [s1 retainCount]);
[s1 retain];
NSLog(@"%lu", [s1 retainCount]);
[s1 release];
NSLog(@"%lu", [s1 retainCount]);
}
// 当引用计数retainCount为零时,自动调用dealloc函数
// 便利构造器中自带autorelease(自动释放)@autoreleasepool{}结束后内存空间回收
return 0;
}