弱自引用的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()?