2012-01-05 50 views
7

我開發了一個iPhone應用程序,它應該支持基於iOS4和iOS5的iPhone/iPad。ARC或不是ARC的iPhone iOS5

由於代碼的大小,我的應用程序在幾個難以調試的地方泄漏內存。我最近讀到ARC(自動引用計數),我的查詢是

  1. 我需要修改我的源代碼(保留/釋放/分配/ dealloc的)編譯與ARC。 還有我們需要使用ARC執行的所有更改?

  2. 建議轉向ARC嗎?

  3. 將我的iOS4手機上的應用程序的工作,如果我使用ARC

感謝。

+0

我建議將此問題作爲wiki條目......這絕對是一個很好的問題,絕對是編程相關的,但絕大多數的問題是真正的意見,並與具體情況有關。 – 2012-01-05 20:35:42

+1

你在這裏問三個不同的問題。第二種是[iOS 5 Best Practice(Release/retain?)](http://stackoverflow.com/questions/6308425/ios-5-best-practice-release-retain)所涵蓋的,第三種是[if convert項目自動引用計數(ARC),它仍然支持iOS 3.X,4.X?](http://stackoverflow.com/questions/6421753/if-convert-project-to-automatic-reference-countingarc -is-it-still-support-on) – 2012-01-05 23:57:32

回答

14

這可能不是發佈這個問題的最佳地方,但我會回答,因爲我不介意這裏的問題。

http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html

  1. 您將使用遷移工具「編輯>重構>轉換成Objective-C的ARC」和手解決任何工具想不通。

  2. 是。

  3. 是的,但歸零弱引用不會。

+0

另一個需要考慮的是許多第三方庫還沒有很好的弧形版本。這使我無法升級我的一些現有項目。 – 2012-01-05 20:46:09

+2

運行轉換時,您可以選擇性地排除ARC中的任何源文件。只需在ARC轉換工具預檢檢查階段取消勾選任何第三方類文件,它將跳過它們並用-fno-objc-arc標記,以便將它們從ARC驗證中排除。這是ARC的最佳功能之一 - 您可以在同一個項目中混合使用ARC和非ARC文件。 – 2012-01-05 23:49:47

4

我絕對認爲這是很好的程序員理解內存管理以及系統如何實際工作...但是,我認爲ARC是一個非常好的系統和作品真的很好。這實際上是一個意見問題,所以我的看法是,除了非常特殊的情況外,幾乎總是有必要啓動將針對iOS上iOS 5應用程序的新項目。

我覺得如果你在代碼中使用了很多C庫,ARC現在有點難以使用了(所以如果你主要使用第三方C庫和CoreFoundation之類的東西,你可能會考慮它是否有意義),但即使如此,如果這些庫大部分都與Objective-C控制器隔離開來,那麼ARC仍然很好。

對於較舊的應用程序,您需要查看應用程序的使用情況和模式。如果你使用了很多委託方法,因爲你不能在iOS 4上使用弱引用,它會變得更加棘手,你可能需要混合使用ARC和非ARC代碼。做一個設計決定來推進ARC可能會更好。因此,新功能是爲iOS 5設計的,可能在應用程序的iOS 4版本中不可用(或完全可用),並且使用ARC。

真的,最終,它將取決於您的應用程序已經設計好了,它有多大,以及管理內存管理和ARC的使用/限制有多舒適。例如,我有三個我從未轉換爲ARC的項目,一個是我現在正在混合使用的項目,一個是完全轉換(但仍以iOS 4+爲目標),另外兩個是ARC和iOS 5+只要。

+0

OpenGL在技術上是C API,儘管沒有任何直接的對象保留,因此不需要'橋接';所有對象都是內部的和不透明的,並通過函數和整數ID進行訪問。但是,在ARC Obj-C代碼中使用OpenGL時還有什麼需要注意的嗎? – 2012-06-19 20:15:14

1

需要明確的是,雖然你不能使用ARC弱引用,如果你的目標的iOS 4,您可以仍然使用unsafe_unretained,這基本上是使用assign爲對象屬性的等價物。這意味着您可以將任何編寫良好的非ARC代碼轉換爲ARC,而不會在iOS 4上意外創建保留週期。

通過使用unsafe_unretained,您將失去弱引用的自動歸零功能,但仍然會獲得ARC的所有其他好處,例如不必擔心忘記在dealloc語句中釋放ivars等。