簡體   English   中英

在制作小型開源iOS API時,如何考慮ARC和非弧用戶

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM