2011-07-31 22 views
87

我已經開始使用Xcode 4.2開發我的第一個iOS應用程序,並且使用「實用程序應用程序」模板(帶有FlipsideViewController的模板)來定位iOS 5.0。如何在使用ARC並定位iOS 4.0時替換弱引用?

,我讀了,因爲ARC是一個編譯時的功能,它應該是與iOS 4兼容的很好,所以我試圖將我的應用程序目標至4.3,並嘗試編譯它。當我這樣做,我得到這個錯誤:

FlipsideViewController.m:錯誤:自動引用計數問題:當前的部署目標不支持自動__weak引用

它引用這條線:

@synthesize delegate = _delegate; 

該變量聲明爲:

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate; 

我明白,「弱引用s「在iOS 4中不被支持,但我不明白爲什麼我想用一個弱引用開始,也不知道如何重寫某些東西以避免使用它,同時仍然利用ARC (畢竟,它應該與iOS 4和5一起工作嗎?)

回答

148

要定位較舊的操作系統,您可以在屬性聲明中使用unsafe_unretained而不是weak,它應該大體上以相同的方式工作。當他們的目標消失時,weak引用了它們自己,但是unsafe_unretained會讓您鏈接的對象在釋放時變成懸掛指針。後者與您在手動內存管理中使用assign作爲屬性聲明的行爲相同。

你這樣做是爲了避免保留週期,這是我在我的答案here提。你不想有一個強指針指向可能有強指針回到原始對象的東西。那麼沒有什麼會得到正確的釋放

+0

感謝您的意見。你說「針對較舊的操作系統......」。這是否意味着我應該只在5.0以前版本的應用中使用unsafe_unretained?或者我可以在我的代碼中使用unsafe_unretained,並構建它以同時針對4.x和5.x? –

+1

@Mason - iOS 4.x和5.0都支持'unsafe_unretained',所以它可以提供向後兼容性。如果你正在做一個5.0版的構建,你可能會切換到「弱」來利用它提供的額外安全性。 –

+0

我試過unsafe_unretained,它無論如何工作。但是,我得到很多警告,如'** __NSAutoreleaseNoPool():__NSArrayM類的對象0x564bd90自動釋放,沒有池 - 只是泄漏「*」,這是正常的? – fifth

11

如果只使用額外的安全性弱引用,手動調用新的運行時功能,如果他們提供,並退回到簡單的分配上__unsafe_unretained變量如果不是。

ZWRCompatibility.h會有所簡化此。

+0

非常感謝@rpetrich! –

10

感謝Mike Ash的兼容庫PLWeakCompatibilty,你現在可以簡單地使用__weak在iOS 4.x中,也是如此。

這是令人難以置信的容易配置,需要在5.x中沒有額外的代價和努力