[英]When making a small open source iOS API, how do I account for ARC and non-arc users
我見過一些庫在源代碼控制中使用了不同的分支。 一個用於ARC,一個用於非ARC。 我不認為這是一個部分,因為它需要額外的維護。
我認為一種方法是使用編譯器標志:(見這個問題)
#if __has_feature(objc_arc)
每當我需要使用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
有了這些,我可以做的事情如下:
return DD_AUTORELEASE(DD_RETAIN(_myIvar));
要么:
DD_RELEASE(_myIvar);
_myIvar = DD_RETAIN(newObject);
要么:
- (void)dealloc {
DD_RELEASE(_myIvar);
#if !DD_HAS_ARC
[super dealloc];
#endif
}
然后宏將擴展為正確的代碼,具體取決於我是否使用ARC進行編譯。
雖然Dave的答案是正確的,但是有一種替代模式可以避免在代碼中維護兩個內存模型。
即,使用ARC編譯代碼,並且:
使用靜態庫來分發代碼; 無論該靜態庫是由目標項目中的新目標構建還是您自己分發庫,都可以為構建庫的目標啟用ARC。
在添加到目標項目中的任何目標時,僅為文件啟用ARC。 可以按文件打開ARC。
在任何情況下,完全支持在每個文件級別混合ARC和非ARC代碼並且工作得很好(正如系統框架幾乎完全是非ARC編譯的事實所證明的那樣,但是從ARC工作正常)。
如果您正在開發靜態(編譯)庫,那么您可以使用您想要的方法。
大部分區別在於編譯時。
這意味着生成的輸出應該相同(如果您在非ARC版本中正確管理內存)。
一旦你編譯它,任何項目都可以使用它,而不用考慮你的庫是否使用ARC開發。
最重要的是,您可以開發基於ARC的庫並在非ARC項目中使用它(反之亦然),沒有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.