最近遇到和看到的一些面试题。

__block 在 ARC 和非 ARC 下含义一样吗?

MRCblock variableblock 中使用是不會 retain 的, 但是 ARC 中 block 則是會 retain 的,取而代之的是用 weak 或是 unsafe_unretained 來更精確的描述 weak reference 的目的。

其中前者只能在 iOS5 之後可以使用,但是比較好 (該物件 release 之後,此 pointer 會自動設成 nil )

而後者是 ARC 的環境下為了相容 4.x 的解決方案。

所以上面的範例中

__block MyClass* temp = ...;    // MRC環境下使用
__weak MyClass* temp = ...;    // ARC但只支援iOS5.0以上的版本
__unsafe_retained MyClass* temp = ...;  //ARC且可以相容4.x以後的版本