2013-05-16 141 views
-2

ARC技術未在我的項目中使用。我正在嘗試添加SBJson庫。我爲所有具有SBJson前綴的文件設置了-fobjc-arc標誌,但是在編譯過程中,ARC語義問題(指向非常量類型'id'的指針沒有明確的所有權)出現在一個類標題中,這與SBJSon無關。爲什麼它不起作用?在非ARC項目中使用ARC庫

行錯誤:

id *_controls; 

我不能告訴你,因爲項目的商業許可的我的代碼,我感謝您的理解。

當我使用該庫的舊版本(無ARC)時,項目編譯通常正常進行。

+0

你能不能至少給出錯誤的行 – Ushan87

+0

try id _controls;沒有* – Ushan87

+0

如果您已經爲SBJson文件設置了「-fobjc-arc」,那麼爲什麼您的代碼使用ARC編譯爲「id * _controls;」? –

回答

3

問題是,您正在通過包含將ARC違規構造混合到ARC'd文件中。您不能將-fno-objc-arc應用於單個頭文件,因爲這沒有意義。

由於它位於頭文件中,因此需要使用#if雜注在行爲之間切換,具體取決於是否正在編譯ARC或非ARC .m文件。

但是,一個更好的解決方案是完全消除ARC和非ARC的問題。鑑於該聲明,它幾乎必須是一個實例變量(儘管它可能在一個結構中)。

如果是伊娃,完全擺脫聲明。要麼通過@property公開它,要麼將它移動到.m文件,如果它不需要公開API。鑑於類型,它確實應該是一個具有公共API的私有實現細節,這使得訪問內容的能力變得更小一點。


通常,使用C語言數組(指針數組)來存儲Objective-C類型是非常令人沮喪的。如果_controls確實需要作爲公開訪問的東西公開(對您項目中的其他類進行公開),然後重構您的代碼以使用集合類(即通常爲具有內部唯一NSMutableArray*支持存儲的公開的NSArray*獲取方 - 例如例如subviewsUIView)。

0

正如你在評論中所說的那樣,預編譯的頭文件包含了一個類頭文件,該頭文件並不打算用ARC編譯。這是導致錯誤的原因,因爲預編譯的頭文件也包含在所有用ARC編譯的SBJson文件中。

我建議您從.pch文件中刪除該類頭文件,並在必要時僅從非ARC源文件中包含它。

+0

不幸的是,我無法從.pch中刪除這個文件。但我決定使用SBJSon的靜態庫。 – alexeyB

相關問題