通用的typeof弱自我引用(Generic typeof for weak self refere

2019-06-25 04:34发布

我试图找出一种方法来使用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