簡體   English   中英

ARC的Objective-C命名約定和可能的警告

[英]Objective-C naming conventions with ARC and possible caveats

我具有純ARC編碼的經驗。 作為一種編譯器功能,它尊重Objctive-C方法家族在需要時進行正確的保留/釋放調用。

allocmutableCopycopynew開頭的所有方法都copy創建一個新對象。 他們增加了保留人數。 結果,當我不再需要ARC時,它將釋放任何指針(並因此釋放與其關聯的對象)。

我認為當我編寫不遵循命名約定的方法時可能會出現問題。 例如,如果我編寫了類似newCustomer的方法,那么在第一個版本中返回一個自動釋放的對象,而在第二個版本中則沒有,那么會發生什么?

特別是,我的問題如下(它們屬於相同的推理):

  • 如果調用和被調用代碼都使用ARC編譯,會發生什么情況?
  • (a)如果使用ARC編譯調用代碼而使用非ARC編譯被調用代碼會怎樣?
  • (b)如果使用非ARC編譯調用代碼而使用ARC編譯調用代碼會怎樣?

可以看到一個顯示ARC如何在objc_release工作的答案( objc_releaseobjc_retainAutoreleasedReturnValue等),將objc_retainAutoreleasedReturnValue

先感謝您。

名為newCustomer的方法將屬於new 方法系列 ,因此被隱式標記為返回保留的對象。 當調用代碼和被調用代碼都使用ARC編譯時,ARC會在調用程序中通過釋放來平衡額外的保留:

從此類函數或方法返回時,ARC會保留返回值評估點的值,然后再離開所有本地范圍。

當從這樣的函數或方法接收到返回結果時,ARC會在包含在其中的完整表達式的末尾釋放該值,但要對本地值進行通常的優化。

資源

如果newCustomer是通過手動引用計數實現的,並且違反了命名約定(即,不返回保留的對象),則調用者可以根據情況而釋放過多或釋放不足。

如果調用者使用ARC,則將從newCustomer返回的對象newCustomer -可能導致程序崩潰。 這是因為調用代碼將參與上述過程的后半部分,而之前沒有執行相應的保留。

如果調用代碼不是使用ARC編譯的,而是被調用的代碼(因此正確實現了返回保留的對象),則行為取決於程序員遵循的命名約定。 如果他們釋放返回的值,則將正確管理對象的引用計數。 但是,如果程序員認為他們的new...方法確實違反了命名約定,並且未能在調用代碼中手動插入版本,則返回的對象將泄漏。

總而言之,正如Martin R.在評論中指出的那樣,關鍵的決定是在任何環境中(包括手動引用計數)是否都遵循命名約定。

就像任何其他語言一樣,當您違反該語言的一些基本假設時,您會進入不確定行為的區域。 在將來的某個時候,Apple可能會修改-new...引用計數的方式的內部。 蘋果公司有責任確保符合預期用途的代碼能夠正常工作,但對於不符合標准的用途,他們不會這樣做。

如果您需要了解在特定系統上運行的特定版本的編譯器的實際行為,則必須對其進行測試。 不要假設其他編譯器或運行時版本的行為相同。

最后,未定義行為是未定義行為。 當您構建依賴它的代碼時,最終將受到微妙且難以診斷的缺陷的影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM