弱自引用的generics
我试图找出一种方法来使用typeof来创build一个self的弱引用在块中使用,以避免保留周期。 
 当我第一次读到这个时,似乎这个惯例是使用__block typeof(self) bself = self;  ,编译但使用__block来避免保留周期不再工作,应该使用__weak 。 
 然而__weak typeof(self) bself = self; 导致错误: 
'typeof(self)'(aka'TUAccountsViewController * const __strong')types已经有保留属性设置
 有没有办法使用typeof或其他调用一般创build一个self弱引用? 
 在最新版本的苹果叮当声版本4.0(tags / Apple / clang-421.1.48)(基于LLVM 3.1svn)上 ,即Xcode __typeof__((__typeof__(self))self) trick已经不再需要了。  __weak typeof(self) bself = self; 线会编译得很好。 
这工作!
 __typeof__(o) __weak 
 我在BBlock项目中定义的BBlockWeakSelf可以这样使用: 
 BBlockWeakSelf wself = self; 
https://github.com/kgn/BBlock/blob/master/BBlock.h
基于Aleph7的回应进行编辑。
正确的做法是
 __weak ActualClassName* weakSelf = self; 
macros只是使得它不清楚variables究竟是什么,以及你实际上在做什么,除了在代码中添加非可移植的元语言。
 如果您需要比ActualClassName提供的更通用的类的版本,那么您就不再处理self了,因为self定义的地方, self定义的类也是如此。 
 在这些情况下,你应该在你的inheritance树NSObject或者更好的地方使用最接近的基类名,从来没有id ,例如 
 __weak MyBaseClassName* weakObject = object; 
genericsWeakself引用(无需导入+代码段)
根据我的经验,要走的路是使用:
 __typeof__(self) __weak weakSelf = self; 
请注意所有权限定符如何在实际variables前面。
很明显,使用它时发生了什么,它可以被制作成Xcode中的一个方便的代码片段,这使得它可以更容易地在需要的任何项目或类中使用。 (我使用“ws”作为片段的完成快捷方式)
嗯..我需要一个弱引用这里..
 ws{return} 
完成。 没有必要在以后的项目中包含头文件,只需使用片段即可。
Xcode代码片段
 标题: Generic Weak Self Reference 
 平台: All 
 语言: Objective-C 
 完成捷径: ws 
 完成范围: Function or Method 
 代码: __typeof__(self) __weak weakSelf = self; 
编辑:添加关于所有权限定符位置基于评论和Xcode片段信息的说明
为什么不只是使用
 __weak id bself = self; 
我认为使用这个是可以的:
__weak __typeof(&* self)weakSelf = self;
它引用AFNetworking的AFURLConnectionOperation.m代码。
我有一个类似的错误,但我不同的修复:
我去了Project Navigator – > Project – > Target – > Build Settings
在那里我找了C语言方言。 我把它从c11改成了GNU99,解决了我的问题。
我希望它有助于:)
declareBlockSafe(self)然后blk(self)在块内。 Self可以是任何variables或实例variables。 使用declareBlockSafeAs来返回属性和方法。
如果您导入Mike Ash的精彩MAZeroingWeakRef,也可以与非ARC兼容。 https://github.com/mikeash/MAZeroingWeakRef
 #if __has_feature(objc_arc) 
 #define declareBlockSafe(__obj__) __weak typeof(__obj__) __tmpblk##__obj__ = __obj__ #define blockSafe(__obj__) __tmpblk##__obj__ #define blk(__obj__) blockSafe(__obj__) #define declareBlockSafeAs(__obj__, __name__) \ __weak typeof((__obj__)) __tmpblk##__name__ = (__obj__) #else #define declareBlockSafe(__obj__) MAZeroingWeakRef *__tmpblk##__obj__ = [MAZeroingWeakRef refWithTarget:__obj__] #define blockSafe(__obj__) ((typeof(__obj__))__tmpblk##__obj__##.target) #define blk(__obj__) blockSafe(__obj__) #define declareBlockSafeAs(__obj__, __name__) \ MAZeroingWeakRef *__tmpblk##__name__ = (__obj__) #endif 
你不是真的需要blk()的ARC,只是为了使macros可以以相同的方式用于非ARC。
我有这个macros
 #define weaken(object) __typeof__(self) __weak weakSelf = object 
我就这样使用它
 weaken(self); //The block referencing weakSelf goes here 
那么__unsafe_unretained呢? 这并不像__weak那么安全,但这是我唯一能想到的。 另外,为什么你使用typeof()?