objective-C MemoryManagement(2)
来源:互联网 发布:海尔集团发展历程 知乎 编辑:程序博客网 时间:2024/06/10 10:11
属性的内部实现原理:
retain:
- (void)setTea:(Teacher *)tea{
//判断原有对象和新对象是否是同一个 如果是同一个,就没有必要再重新赋值了.否则会先release,release之后空间回收,此时再retain就变成野指针了
if (_tea != tea) {
[_tearelease];//释放之前对象保有的所有权,如果不释放,将会造成内存泄漏
// self.tea = tea; 相当于[self setTea:tea] 死循环
_tea = [tea retain]; //让实例变量_tea保有新的对象的所有权.
}
}
- (void)setTea1:(Teacher *)tea1{
if (_tea1 != tea1) {
[_tea1 release];
//如果想对一个对象进行copy操作,对象的类必须服从NSCopying协议,并实现协议中的方法
_tea1 = [tea1 copy];
}
copy协议中的方法:
- (id)copyWithZone:(NSZone *)zone{
Teacher *newTea = [[Teacher allocWithZone:zone] init];
newTea.name = self.name;
newTea.gender = self.gender;
return newTea;
}
+ (id)teacherWithName:(NSString *)name gender:(NSString *)gender{
Teacher *teacher = [[Teacher alloc] initWithName:name gender:gender];
return [teacher autorelease];
}
遵循内存管理的黄金法则,外部在使用便利构造器的时候,不用手动release
colletion(集合)的内存管理:
当把一个对象放入集合中时(数组,字典,集合),会将对象的引用计数+1,因为内部做了retain操作.
当集合(数组,字典,集合等),空间被回收时,他们会向空间中的每一个元素发送一个release消息(对应添加元素时 的retain操作)
从数组中移除一个元素时,会release高对象,引用计数-1
当对象的属性特性为retain是,在对象用完被回收时,需要对象的实例变量进行引用计数清0操作,即重写dealloc方法:
- (void)dealloc
{
NSLog(@"%@空间已回收", self.name);
[_name release];
[_gender release];
[super dealloc];
} (代码中的name,gender属性语义特性声明为retain)
- objective-C MemoryManagement(2)
- Objective-C MemoryManagement(1)
- Objc-C 知识点回顾 十 MemoryManagement
- Objective-C introduction - 2
- 2-Objective-C 编程
- Objective-c学习2
- 2-Objective-C 编程
- Objective-C笔记-2
- 再探Objective-C.2
- objective-c 笔记2
- Objective-C NSString--(2)
- Objective-C Block(2)
- Objective-C Runtime(2)
- [Objective-C] 02.Objective-C语法基础2
- Objective-C开发指南--2
- Objective-c 学习(2)
- objective-c语言基础2
- Objective-C基础教程读书笔记(2)
- 实现算法2.20、2.21的程序
- poj 1647Sorting by Swapping
- (3)前端项目AngularJS的第三部分总结
- 带头结点的线性链表类型
- Final在Java中的用法
- objective-C MemoryManagement(2)
- 在php中直接使用socket编程对memcached缓存进行增删改查数据
- 学习日记之解释器模式和Effective C++
- MFC中的DC、CDC、HDC、句柄、设备上下文的不同意思,适合初学者参考
- 双向链表
- 高质量C,C++编程指南 知识点小结(一)
- 两个仅设表尾指针的循环链表的合并(教科书图2.13)
- 【Nutch2.2.1基础教程之6】Nutch2.2.1抓取流程
- 南阳 358取石子(五)(斐波那契博弈)