我试图找出一种方法来使用typeof
创建一个弱引用self
用于块,以避免保留周期。
当我第一次读到这似乎约定是使用__block typeof(self) bself = self;
,它编译但使用__block
避免保留周期不工作了,并__weak
应改为使用。
然而__weak typeof(self) bself = self;
导致一个错误:
类型“的typeof(自我)”(又名“TUAccountsViewController * const的__strong”)已经retainment属性设置就可以了
有没有办法使用方式typeof
或再次调用一般创建一个弱引用self
?
Answer 1:
在最新版本的铛铛苹果版本4.0(标签/苹果/铛- 421.1.48)(基于LLVM 3.1svn),即4.4以上版本的Xcode的__typeof__((__typeof__(self))self)
招不再是必需的。 的__weak typeof(self) bself = self;
行将编译就好了。
Answer 2:
这个作品!
__typeof__(o) __weak
我在我的B块项目中已经定义BBlockWeakSelf
它可以这样使用:
BBlockWeakSelf wself = self;
https://github.com/kgn/BBlock/blob/master/BBlock.h
基于Aleph7的回应编辑。
Answer 3:
要做到这一点,正确的方法是
__weak ActualClassName* weakSelf = self;
宏只能使目前尚不清楚该变量实际上是,你实际上是用它做什么,除了添加非便携的元语言代码。
如果你需要的类的更宽泛的版本比ActualClassName提供,你是不是对付self
了,因为在那里self
定义,所以是类的self
定义。
在这种情况下,你应该在你的继承树,使用最近的基类名称NSObject
或更好的,从来没有id
,如
__weak MyBaseClassName* weakObject = object;
Answer 4:
通用Weakself参考(不导入所需的+片段)
根据我的经验,要走的路是用:
__typeof__(self) __weak weakSelf = self;
注意所有权预选赛中的实际变量前面怎么所属。
这是非常明显的在使用它,它可以做成在Xcode一个方便的代码段,这使得它更容易在这个需要任何项目或课堂上使用发生了什么。 (我用的“WS”作为片断的完成快捷方式)
嗯..我在这里需要一个弱引用..
ws{return}
完成。 无需以往任何时候都包括在这个未来项目的标题,只需使用该代码段。
Xcode的片段
标题: Generic Weak Self Reference
平台: All
语言: Objective-C
完成快捷方式: ws
完成作用域: Function or Method
代码: __typeof__(self) __weak weakSelf = self;
编辑:关于基于所有权预选赛位置添加了注意事项的意见 ,以及Xcode的片段信息
Answer 5:
为什么不只是使用
__weak id bself = self;
Answer 6:
我想用这个是确定:
__weak __typeof(&*自我)weakSelf =自我;
它引用AFNetworking的AFURLConnectionOperation.m代码。
Answer 7:
我有一个类似的错误,但我固定它是不同的:
我去项目浏览器 - >项目 - >目标 - >构建设置
在那里,我找了C语言的方言。 我从C11到GNU99改变它,它解决了我的问题。
我希望它能帮助:)
Answer 8:
declareBlockSafe(个体)然后BLK(个体)的块内。 自可以是任何变量或实例变量。 使用的性质和方法返回declareBlockSafeAs。
如果导入迈克·阿什的精彩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
你并不真的需要ARC BLK(),它只是使宏在非ARC相同的方式使用。
Answer 9:
我有这个宏
#define weaken(object) __typeof__(self) __weak weakSelf = object
我用它像这样
weaken(self);
//The block referencing weakSelf goes here
Answer 10:
约__unsafe_unretained什么? 这不是因为__weak为安全的,但它是我能想到的唯一的事情。 另外,为什么你用的typeof()?
文章来源: Generic typeof for weak self references