苹果设备的内存管理
mac系统内存管理:垃圾回收以及引用计数管理
手机IOS设备:引用计数管理
影响引用计数的方法
alloc
开辟空间 引用计数 从0 –> 1
retain
使引用计数 + 1
copy
取决于怎么写
release
影响引用计数 - 1
autorelease
需要自动释放池去 - 1
// 释放池
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[p1 autorelease];
[pool release];
// 释放池(目前用的)
@autoreleasepool {
Person *p2 = [Person personWithName:@"11" age:11];
}
当对象的引用计数为0时 该对象就会被释放,然后调用dealloc方法
delloc方法
- (void)dealloc{
// 如果你要在dealloc中使用对象的话
// 一定要写在[super dealloc]的上面
// 避免出现野指针问题
NSLog(@"哈哈 释放了");
// 如果重写dealloc 必须调用父类的方法
// 保证 对象可以被释放
[super dealloc];
}
总结: 类方法 便利构造器方法 使用 autorelease
其他方法 需要在外部释放
copyWithZone:
实现拷贝协议的方法,copy对引用计数的影响,看这个函数怎么写
// 伪拷贝
// return self;
// 浅拷贝
// 浅拷贝后有两个对象 但是两个变量的值是同一个值
// 引入计数变化 被拷贝的对象不变 拷贝出来的新对象加1 从0 --> 1
// Person *per = [[Person alloc] initWithName:self.name age:self.age];
// 深拷贝 拷贝出新对象 并且对象值也重新拷贝出一份 再赋值
// 对字符串进行拷贝 拷贝的结果要看字符串 这个类如何实现的方法
// 对不可变字符串的拷贝方法 对不可变字符串的拷贝 其实相当于 直接retain一次
// 可变字符串 拷贝时 就是真拷贝一个新的
NSString *name = [_name copy];
Person *per = [[Person alloc] initWithName:name age:_age];
return per ;