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框架会自动帮我们管理。
|