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