黑马程序员技术交流社区
标题: 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 |