3

我製作了一個使用ARC編碼的靜態庫。我計劃將這個庫分發給其他人使用。我知道在非ARC項目中不需要做ARC靜態庫,但包含ARC頭文件又怎麼樣?例如,我的ARC靜態庫的頭文件聲明屬性爲weakstrong,但是當我嘗試將這些頭文件包含在非ARC項目中時,編譯器就嚇倒了。在非ARC項目中包含ARC標題

任何想法?

+0

如果我沒有錯,這是不能做到的。您可以禁用ARC項目中的某些文件,但不是相反......我認爲您應該考慮將您的項目遷移到ARC。這個問題可能有所幫助:http://stackoverflow.com/questions/6368600/some-questions-about-automatic-reference-counting-in-ios5-sdk – bontoJR 2012-03-06 15:47:59

+1

你可以通過傳遞'-fobjc-arc '。但是這個問題涉及到一個預編譯的靜態庫。我假設整個圖書館將用ARC構建。 – 2012-03-06 16:02:04

+0

是的,整個圖書館都是用ARC構建的。 – edc1591 2012-03-06 23:58:09

回答

3

對於strong,您可以使用retain。它們是相同的。

weak更棘手,雖然我知道應該工作的幾種方式,但我不確定處理它的最佳方式。

首先,確保你確實需要它。如果你支持iOS4,那麼你不能有weak,所以這個問題是沒有意義的。我的直覺是,我可能會避免weak,並使所有這些問題消失。弱點很好,但在大多數情況下,這並不是什麼大事。

也就是說,有一些方法可行。最好的可能是在頭文件中聲明weak沒有屬性的訪問器。取而代之的是:

@property (nonatomic, readwrite, weak) id delegate; 

這樣做:

- (id)delegate; 
- (void)setDelegate:(id)aDelegate; 

,那麼你仍然可以宣佈你的實現文件裏面weak屬性。調用者仍然可以爲此使用點符號,順便說一句。

這裏可能會出現編譯錯誤,因爲setDelegate:在技術上需要__strong id。如果是這樣的話,只需手工執行setDelegate:

- (void)setDelegate:(id)aDelegate { 
    _delegate = aDelegate; 
} 

沒有測試過,但應該有效。您也可以在@implementation區塊中宣佈伊瓦爾_delegate__weak,而不是聲明它爲weak屬性。

就像我說的;我還沒有測試過這些。如果它發揮作用,請發表你的發現。

+0

如果它是一個已編譯的靜態庫,那麼您可以簡單地更改導入到應用程序中的頭,因爲頭對靜態庫中編譯的實現沒有影響。 – 2012-03-06 18:22:44

+0

非常有趣的一點。有點可怕,但可能有效。我並不知道可以使用這種預處理器宏,但這會使這種方法更簡單。 – 2012-03-06 18:31:36

+0

這可能是一種可能性。有沒有反對這樣做的爭論,還是會相當安全? – edc1591 2012-03-06 23:59:30