1、内存管理
1.1 不需要手工管理内存的情况
1.1.1、使用类方法创建的对象不需要我们管理计数器
1.1.2、放进容器类中的对象不需要我们管理计数器(对象进入容器自动retain,离开容器或容器被销毁自动release)
如:使用类方法创建对象的情况:
NSString *name = @"张三三"; // name是使用类方法(字面量相当于便立构造器,即类方法)创建的对象,不需要我们release
// 便立构造器创建person2
Person *person2 = [Person person:@"小虎"]; // person2 使用类方法创建的对象不需要我们release
Person *person3 = [Person person:name]; // person3 使用类方法创建的对象不需要我们release
如:放进容器类中的对象:
1.2需要手工管理内存的情况
使用alloc(计数器从0倒一)、copy(新对象的计数器加一)、retain(计数器加一)、new(计数器从0到1)创建、引用的对象需要手工管理内存
2、容器类内存管理方式
NSMutableArray *array = [NSMutableArray array]; // 使用类方法创建的对象会在出了释放池后,被系统自动释放
Person *p1 = [[Person alloc] init];
NSLog(@"array = %ld", [array retainCount]); // 1
NSLog(@"p1 = %ld", [p1 retainCount]); // 1
[array addObject:p1]; // 将p1加入容器中,容器自动进行一次retain
NSLog(@"array = %ld", [array retainCount]); // 1
NSLog(@"p1 = %ld", [p1 retainCount]); // 2
[array removeObject:p1]; // 将p1移出容器,容器自动将release
NSLog(@"p1 = %ld", [p1 retainCount]); // 1
[p1 release];
NSLog(@"p1 = %ld", [p1 retainCount]); // 0
3、便利构造器的内存管理方式
return [p autorelease]是最完美的解决⽅案,既不会内存泄 露,也不会产⽣野指针。
如:
+ (instancetype)person:(NSString *)name
{
Person *p = [[Person alloc] initWithName:name];
return [p autorelease]; // 便利构造器的内存管理方法:使用(autorelease):在p出了releasepool时才释放对象p
}
4.1.1dealloc是NSObject的⼀个实例⽅方法,与alloc对应,用于回收开辟的内 存空间
4.1.2这个⽅法在本类对象引⽤计数为0时,由系统⾃动调⽤用
4.1.3通常我们在dealloc中释放类的实例变量
如:
// 当本类对象被释放的时候,会走dealloc方法
// 在方法内,需要release一次属性语义设置词是retain或者copy的属性
- (void)dealloc
{
[_name release]; // 释放setter方法造成的_name属性的内存泄漏
[super dealloc]; // 调用从父类继承过来的dealloc方法
}