iOS ARC tips

1.ARC是Objective-C编译器的一个特性,所有ARC相关的处理都会发生在你构建你的应用的时候。


2.ARCB不是运行时特性(除了其中的一点,weak指针系统)。它不是你在其他编译语言中所了解的垃圾回收机制。


3.ARC所做的事情就是在你编译代码的时候,在那些你需要自己处理内存管理的地方,插入retain和release。这就使得ARC和手工内存管理的速度一样快,有时还会更快一些,因为它在后端进行了一些优化操作。


4.strong,默认情况下,所有实例变量和局部变量以及方法参数都是strong指针。


5.weak,weak类型的变量也能指向一个对象,但是他们不能成为所有者,当其指向其他所有者对象释放时,其值自动变为nil。


6.weak类型不会频繁使用,他们大多在两个父子关系的对象上比较有用。父对象会有一个strong类型的指针指向子对象,因此它拥有了子对象,但是为了防止所有关系循环,子对象仅仅有一个weak指针指向父对象。(常见于代理中)。


7.ARC也有一些不足,仅仅适用于Objective-C对象,如果你的应用中用到了CoreFoundation 或者malloc()和free(),你还需要负责内存管理。


8.Objective-C中,逗号将多个表达式连接成一个语句是有效的。


9.ARC中禁止在Objective-C中使用结构体和共同体,其限制就是在C接口中放入Objective-C对象了,推荐的方式是将这个结构体直接转换成Objective-C对象。


10.dealloc方法,应该留着,释放用CoreFoundation对象调用CFRelease(),以及那些通过malloc()分配的内存调用free(),停止timer等。


11.属性?在ARC以前,属性这个东西是为了更方面的手动管理内存,在ARC以后属性应该使用实例变量比较好。


12.retain关键字在ARC中仍然有效,它只不过是strong的一个代号。


13.weak是所有outlet属性推荐的声明关系,因为这个试图已经是视图控制器视图图层中的一部分了,不需要在其他地方retain了,声明weak的好处是,省去了你自己写viewDidUnload方法的时间。当iPhone收到低内存警告时,视图控制器的主视图会被释放掉,这样也会释放掉它所有的子视图。


14.unsafe_unretained,这个以前的"assign"等同,assign,你不再允许在对象上使用这个修饰符,但在基本类型的值,比如BOOL, int, float中仍用到它。


15.当你在CoreFoundation和Cocoa中转换对象时Bridged casts是必须的。Bridging casts要解决的是,如果你把一个NSObject当做一个CoreFoundation对象,那么ARC就不再负责释放它,但你需要告诉ARC你的意图,编译器自己不能推断出来;同样如果你创建了一个CoreFoundation对象,但然后把它转换成了NSObject,你需要告诉ARC获得它的所有关系,并在适合的时候释放这个对象。


16.bridged cast关系,__bridge保持原有关系(NSObject ->CoreFoundation,用__bridge修饰,表示仍保持原有NSObject关系(ARC释放原则);CoreFoundation->NSObject,用__bridge修饰,表示仍保持原有CoreFoundation关系(ARC不负责释放)。


17.__bridge_tansfer:把所有关系给ARC。


18.__bridge_retained:收回ARC的所有关系。


19.为了更方便的记住改用那种类型的bridge,有一个工具方法CFBridgeRelease()。它和__bridge_transfer类型转的效果是一样的,它是一个inline函数,所以它不比直接的类型转换慢多少。即:当调用含有Create,Copy或Retain的CoreFoundation函数的地方,使用CFBridgeRelease()(__bridge_transfer等价)。


20.CFBridgeRetain()等价于__bridge_retained,在NSObject转换成CoreFoundation的时候调用。


21.不是所有的Objective-C和CoreFoundation都可是toll-free bridged的,例如CGImage 与UIImage就不能, CGColor与UIColor也不能,等等.


22.__bridge不仅限于CoreFoundation,一些API使用void *类型的指针,可以让你存放任何类型的引用,不管是Objective-C对象,还是CoreFoundation对象,malloc分配的内存等等。void *表示法的意思是:这是一个指针,但它实际的数据可以是任何东西。如果将Objective-C对象转换成 void *,需要使用 __bridge转换。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值