Rob*_*ert 2 iphone objective-c ios automatic-ref-counting
我见过一些库在源代码控制中使用了不同的分支.一个用于ARC,一个用于非ARC.我不认为这是一个部分,因为它需要额外的维护.
我认为一种方法是使用编译器标志:(见这个问题)
#if __has_feature(objc_arc)
Run Code Online (Sandbox Code Playgroud)
每当我需要使用retain释放等...这样,如果用户打开它,代码将自动重新考虑自己.
这样做有缺点吗?
有没有更好的方法呢?
这就是我如何做到的. 我也有一些宏,以便我的代码保持相对"干净":
#if __has_feature(objc_arc)
#define DD_HAS_ARC 1
#define DD_RETAIN(_o) (_o)
#define DD_RELEASE(_o)
#define DD_AUTORELEASE(_o) (_o)
#else
#define DD_HAS_ARC 0
#define DD_RETAIN(_o) [(_o) retain]
#define DD_RELEASE(_o) [(_o) release]
#define DD_AUTORELEASE(_o) [(_o) autorelease]
#endif
Run Code Online (Sandbox Code Playgroud)
有了这些,我可以做的事情如下:
return DD_AUTORELEASE(DD_RETAIN(_myIvar));
Run Code Online (Sandbox Code Playgroud)
要么:
DD_RELEASE(_myIvar);
_myIvar = DD_RETAIN(newObject);
Run Code Online (Sandbox Code Playgroud)
要么:
- (void)dealloc {
DD_RELEASE(_myIvar);
#if !DD_HAS_ARC
[super dealloc];
#endif
}
Run Code Online (Sandbox Code Playgroud)
然后宏将扩展为正确的代码,具体取决于我是否使用ARC进行编译.
虽然Dave的答案是正确的,但是有一种替代模式可以避免在代码中维护两个内存模型.
即,使用ARC编译代码,并且:
使用静态库来分发代码; 无论该静态库是由目标项目中的新目标构建还是您自己分发库,都可以为构建库的目标启用ARC.
在添加到目标项目中的任何目标时,仅为文件启用ARC.可以按文件打开ARC.
在任何情况下,完全支持在每个文件级别混合ARC和非ARC代码并且工作得很好(正如系统框架几乎完全是非ARC编译的事实所证明的那样,但是从ARC工作正常).
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |