OC第十天 内存管理高级

来源:互联网 发布:windows 调试模式 编辑:程序博客网 时间:2024/06/07 04:58

属性的语义特性以及使用范围:
assign 一般用于基本数据类型 ,因为基本数据类型的内存不需要我们管理, 但是也可以用于对象 不过会产生野指针异常的问题,需要对原本的set,get方法进行修改

现在有个Person类 有个name属性
如:`Perosn *per = [[Person alloc]init]; // 用alloc进行定义,以便我们进行内存管理,类方法不需要管理.
NSString *name = [[NSString alloc]initWithFormat:@”王”];
p.name = name;
[name release];
NSLog(@” %@ “,p.name); // name已经被释放掉了,还在使用,野指针异常
对set方法进行修改
- (void)setName:(NSString *)name
{
if (_name != name) { // 判断传进来的值和现在的值等不等
// 如果你对空release
// 相当于什么都没做
[_name release]; // 这句话是将原来的_name的计数-1 释放掉
_name = [name retain]; // 计数+1 ,name计数为2,release后对象也不会释放掉
}

}
`
-(void)dealloc 写在.m的最上面,计数为0的时候会调用这个方法,进行释放空间 [super dealloc]

学了属性和内存之后,不要出现_name 全部都写self.name 在自定义初始化方法里将 _name = name 改成 self.name = name; 为了保证内存的安全
类方法中写成这样: 最后返回值写成: return [p autorelease];

Collection 的内存管理
数组在添加元素时 : 如果你把一个元素 添加到容器类对象中(数组,字典,集合中)那么系统将自动给数组中的元素发送retian消息 从而使数组中的元素引用计数+1
数组在释放时: 如果数组释放时,那么在释放之前,系统会自动给数组中的一个元素 发送release消息 从而使数组中的元素引用计数-1
字典也是这样的
多态的真谛: 父类指针指向子类对象 继承关系才有多态

0 0
原创粉丝点击