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转换。