2014-09-05 43 views
0

我的iOS項目的費用非常龐大,許多團隊都參與其中,一些模塊由ARC編寫,其他模塊不是,理論上這兩種技術應該合作 - 很好。ARC和非ARC代碼共同合作,在iOS上發生意外的行爲案例

事實上,對於98%的情況而言,對於罕見的行爲會發生意外行爲,特別是ARC管理的指針與自動釋放無關行爲一樣。

請參閱以下代碼,billWebPageVC將會自行發佈以及@autoreleasepool,不確定iOS如何使用它?任何有這方面經驗的人都請先共同分享和討論,謝謝。

PS: UPBillWebPageViewController類和UPWebData類都是ARC,但推送它的viewcontroller是無弧的。

UPWebData * webData = [[[UPWebData alloc] initWithLaunchType:ELaunchTypeLocalMerchant poiData:_favorMechModel.data[indexPath.row]] autorelease]; 

UPBillWebPageViewController* billWebPageVC = [[[UPBillWebPageViewController alloc] initWithWebData:webData] autorelease]; 

[self.navigationController pushViewController:billWebPageVC animated:YES]; 
+0

你的意思是你的應用程序在這裏崩潰?對不起,我沒有得到「billWebPageVC將與@autoreleasepool一起釋放」的觀點。 – KudoCC 2014-09-05 07:21:54

回答

0

內存管理是本地的。手動內存管理中應遵循的規則保證了一組標準的內存管理對象,這些內存管理是通過函數傳遞的,因此爲了在函數中編寫正確的內存管理,您只需要關心函數內部的功能,而不是什麼其他功能呢。自動引用計數(ARC)只是一個編譯時機制,可以自動執行這些規則。

只要編譯了一個函數以正確地遵循這些規則,它就不會在運行時對外部代碼產生影響,無論它是使用MRC還是ARC編寫的。用MRC和ARC編寫的函數彼此之間應該沒有問題,因爲它們遵循相同的規則集,並且從不假定任何其他函數都是用MRC或ARC編寫的。

您顯示的代碼位於MRC中。它看起來很好,似乎沒有違反任何內存管理規則。它所調用的代碼是用MRC還是ARC編寫是完全不相關的(它甚至可能被其他人編譯,甚至可能不知道它們是如何編譯的)。

+0

謝謝。 ARC如何實現autorelease? – jianhua 2014-09-12 03:06:23

+0

@jianhua:我真的不明白你的意思。 autorelease池是一種運行時機制,而ARC是一種編譯時機制。根據ARC的規定,ARC可以保留,釋放或自動釋放事物。 – newacct 2014-09-12 04:16:24

0

如果你想在你的圓弧項目添加非弧線類,你應該添加編譯器標誌在項目設置/建造階段可可-fno-objc-arc

+0

當然,如果他沒有做到這一點,編譯器會看到'release','retain'和'autorelease'關鍵字時就會出現問題嗎? – trojanfoe 2014-09-05 07:43:25