OC-内存管理总结

1.oc对象内部都有引用计数器(retaincount)来管理内存,计数器占4个字节;

  记住:4个字节
2.retain 方法计数器+1,返回对象本身;release 方法计数器-1;retainCount返回计数器值

  
3.对象销毁方法dealloc

  方法为:

  -(void)dealloc{

  //如果之前拥有一个新对象,给XX对象retain一次的话

  [_XX release];

  NSLog(@"%@对象被销毁了!",self.name);

  [super dealloc];//这句不可少,而且还得放在最后

}


4.ARC计数器自动管理,练习时需要关闭

  
5.僵尸对象:所占内存已被回收的对象
6.野指针:指向僵尸对象(不可用内存)的指针.

      //不能再用,否则就是野指针错误

7.空指针:没有指向任何对象的指针
8.内存使用原则,谁创建谁release,谁retain谁release

  谁申请,谁释放
9.四种方式访问变量
  (直接访问,self->_xxx),(self.xxx,[self xxx])

   例如:

  NSLog(@"%@",_name);

  NSLog(@"%@",self->_name);

  NSStrig *str = self.name;

  NSLog(@"%@",[self name]):
10.set方法,先判断赋值对象是否相等后再进行release和retain,防止野指针错误;

    -(void)setName:(Book *)book{

      if(_book=book){

      [_book release];     //release旧值

      [book retain];     //retain新值--这其实在@property里面的retain都代替了

//@property (nonatomic ,retain)(Book *)book;

}

} 

注意:但当在dealloc中,这个新的又是当前的了,所以这的释放[_book release]   

11.尽量不要在release之后,再去操作对象

 

补充:

 

1.系统对象比如NSString等不需要进行release

2.@property默认是assign修饰符,会自动生成get和set方法,但只是做简单的赋值;


3.@property (retain)修饰符,才会加上内存管理代码(新旧值比较,先release后retain)
   所以只要是自定义对象都要加上retain修饰符!最后记得dealloc方法里释放对象操作!


4.@property的4种修饰符
   >set方法内存管理参数,retain,assign(直接赋值),copy(release旧,copy新)
   >是否要生成set方法:readonly,readwrite默认
   >多线程管理:nonatomic线程不安全,atomic同步(默认)
   >setter和getter方法的名称:只有当bool类型才会使用getter采用is语法


5.time_t时间类型实际就是long类型


6.#import和@class的区别
1>#import是导入文件内容,@class只是告诉编译器,某个名称是一个类
2>.h文件中使用@class来声明类,.m文件中使用#import来包含类的所有内容


7.使用@class的好处:
1>避免对象互相#impor时的死循环
2>不需要导入类内容,提升编译效率


8.对象彼此引用时,一方使用assign方式,一方使用retain,避免内存泄漏;

 

posted @ 2014-12-18 18:23  M了个WX  阅读(157)  评论(0)    收藏  举报