我製作了一個使用ARC編碼的靜態庫。我計劃將這個庫分發給其他人使用。我知道在非ARC項目中不需要做ARC靜態庫,但包含ARC頭文件又怎麼樣?例如,我的ARC靜態庫的頭文件聲明屬性爲weak
和strong
,但是當我嘗試將這些頭文件包含在非ARC項目中時,編譯器就嚇倒了。在非ARC項目中包含ARC標題
任何想法?
我製作了一個使用ARC編碼的靜態庫。我計劃將這個庫分發給其他人使用。我知道在非ARC項目中不需要做ARC靜態庫,但包含ARC頭文件又怎麼樣?例如,我的ARC靜態庫的頭文件聲明屬性爲weak
和strong
,但是當我嘗試將這些頭文件包含在非ARC項目中時,編譯器就嚇倒了。在非ARC項目中包含ARC標題
任何想法?
對於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
屬性。
就像我說的;我還沒有測試過這些。如果它發揮作用,請發表你的發現。
如果它是一個已編譯的靜態庫,那麼您可以簡單地更改導入到應用程序中的頭,因爲頭對靜態庫中編譯的實現沒有影響。 – 2012-03-06 18:22:44
非常有趣的一點。有點可怕,但可能有效。我並不知道可以使用這種預處理器宏,但這會使這種方法更簡單。 – 2012-03-06 18:31:36
這可能是一種可能性。有沒有反對這樣做的爭論,還是會相當安全? – edc1591 2012-03-06 23:59:30
如果我沒有錯,這是不能做到的。您可以禁用ARC項目中的某些文件,但不是相反......我認爲您應該考慮將您的項目遷移到ARC。這個問題可能有所幫助:http://stackoverflow.com/questions/6368600/some-questions-about-automatic-reference-counting-in-ios5-sdk – bontoJR 2012-03-06 15:47:59
你可以通過傳遞'-fobjc-arc '。但是這個問題涉及到一個預編譯的靜態庫。我假設整個圖書館將用ARC構建。 – 2012-03-06 16:02:04
是的,整個圖書館都是用ARC構建的。 – edc1591 2012-03-06 23:58:09