kee*_*n3d 34 cocoa weak-references objective-c objective-c-blocks automatic-ref-counting
我试图找出一种方法来typeof创建一个弱的引用,self以便在块中使用,以避免保留周期.
当我第一次读到这个时,似乎是使用惯例__block typeof(self) bself = self;,编译但是使用__block以避免保留周期不再起作用而__weak应该使用.
但是会__weak typeof(self) bself = self;导致错误:
类型'typeof(self)'(又名'TUAccountsViewController*const __strong')已经设置了保留属性
有没有办法使用typeof或其他调用一般创建一个弱引用self?
0xc*_*ced 37
在最新的clang版Apple clang 4.0版(标签/ Apple/clang-421.1.48)(基于LLVM 3.1svn),即Xcode 4.4+,__typeof__((__typeof__(self))self)不再需要这个技巧了.该__weak typeof(self) bself = self;行将编译得很好.
kee*_*n3d 32
这有效!
__typeof__(o) __weak
Run Code Online (Sandbox Code Playgroud)
我在我的BBlock项目中定义的BBlockWeakSelf可以像这样使用:
BBlockWeakSelf wself = self;
Run Code Online (Sandbox Code Playgroud)
https://github.com/kgn/BBlock/blob/master/BBlock.h
根据Aleph7的回复编辑.
Bra*_*ane 18
正确的方法是
__weak ActualClassName* weakSelf = self;
Run Code Online (Sandbox Code Playgroud)
除了在代码中添加非可移植元语言之外,宏只会让人不清楚变量实际上是什么,以及你实际使用它的是什么.
如果您需要比ActualClassName提供的类更通用的版本,那么您不再处理self,因为self定义了哪里,定义的类也是如此self.
在这些情况下,您应该在继承树中使用最接近的基类名称,NSObject或者更好,从不id,例如
__weak MyBaseClassName* weakObject = object;
Run Code Online (Sandbox Code Playgroud)
Thu*_*ets 16
根据我的经验,走的路是使用:
__typeof__(self) __weak weakSelf = self;
很明显当它被使用时会发生什么,它可以被制作成Xcode中的一个方便的代码片段,这使得它更容易在任何需要它的项目或类中使用.(我使用"ws"作为代码片段的完成快捷方式)
嗯......这里我需要一个弱引用..
ws{return}
完成.无需在此未来的项目中包含标题,只需使用该代码段即可.
标题:Generic Weak Self Reference
平台:All
语言:Objective-C
完成快捷方式:ws
完成范围:Function or Method
代码:__typeof__(self) __weak weakSelf = self;
编辑:根据评论添加有关所有权限定符位置的注释,以及Xcode片段信息