黑马程序员技术交流社区

标题: OC笔记 [打印本页]

作者: amoshaxiangp    时间: 2015-11-7 18:25
标题: OC笔记
11. 苹果官方内存管理的基本原则:
   1) 谁创建谁release ,如果你通过alloc,new 或 copy ,mutableCopy 创建了一个对象,那么必须调用 release 或者autorelease  。
   2)谁retain 谁release,只要你调用了retain ,就必须调用一次release 。

12.@property 的修饰关键字:
   1)控制set 方法的内存管理 :retain :release 旧值,retain 新值(用于OC对象) ,要配合nonatomic 使用。   比如: @property (nonatomic , retain)  car ;
                                                        assign:直接赋值,不做任何内存管理(默认,用于非OC对象类型),不会进行retain。
                                                        copy:release 旧值 ,copy 新值 (一般用于NSString *);
   2)控制是否生成set方法: readwrite: 同时生成get 和set 方法(默认)  ; readonly: 只读,不生成set方法,只生成get方法。
   3)多线程管理:atomic:性能低(默认);nonatomic:性能高,(为IOS系统开发时建议使用,为mac开发可以使用atomic);
   4)控制get和set 方法的名称: setter: 这是set方法的名称,注意要有冒号;getter: 设置get方法的名称,冒号。

13.@class的用法:
    1)为什么要使用@class?  主要是用于解决循环引入的问题,比如A引入B,B引入A,这时用#import 会造成循环以来,使用@class则不会。注意:使用@class之后,要在.m文件中引入 .h文件,比如:A的.m文件中,要引入B.h文件。
    2)和import的区别:主要就是解决循环依赖的问题。

14.内存管理时的循环retain问题。
     比如,A中有一个B 实例对象,B中有一个A实力对象,这时如果把A赋值给B,B赋值给A,如果A,B都是用retain ,会造成程序结束的时候A,B引用计数仍为1,AB无法释放,内存泄漏。
    如果此时A使用retain,B使用assign,则不会造成这种现象,注意:assign的dealloc中不需要release。这是推荐使用方法。另外的方法是:在最后对A或者B 再次进行释放,此处需要注意顺序问题,必须是在程序的最后。

15.NSString的内存管理问题。
    初始化字符串的时候,直接赋值 @"abc",stringWithString ,alloc  initWithString这三种方法中,@"abc"  存放在常量池。重复赋值,不会重新分配内存空间。
     注意:常量区的引用计数是lu的最大值。
    stringWithFormat  alloc  initWithFormat ,存放的地址为堆区。     NSString 不需要我们进行内存管理,Foundation框架会自动帮我们管理。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2