İOS5 SDK'da Otomatik Referans Sayma ile ilgili bazı sorular


134

Şu anda iPad için bir uygulama geliştiriyorum. İOS 4.2 için geliştirme başladı ve şimdi iOS 4.3 için devam ediyor (ve sanırım tamamlanacak). Sadece iOS 5'teki ARC hakkında okudum ve temelde artık nesneleri serbest bırakıp tutmamız gerekmediğini anladım. Sorularım:

  1. İOS 5'e yükseltmeye karar verirseniz, kodumdaki tüm ifadeleri [myObject retain]ve [myObject release]ifadeleri kaldırmam gerekir mi?

  2. ARC kullanarak iOS 5 için yeni bir uygulama geliştirirsem, bir çeşit "geriye dönük uyumluluk" kontrolü uygulamam gerekir mi? ie: iOS sürümünü kontrol etmem ve buna bağlı olarak tutma ve bırakma çağrısı yapmam gerekir mi? Yani, temel olarak, ARC tüm iOS sürümleri için mi yoksa sadece iOS 5 için mi mevcut?

Yanıtlar:


150

İOS 5'e yükseltmeye karar verirsem tüm [myObject retain] ve [myObject release] ifadelerini kodumdan kaldırmam gerekir mi?

Evet, ancak XCode 4.2 bunu sizin için yapan yeni bir "Objective-C ARC'ye Geç" aracı (Düzenle-> Refactor menüsünde) içerir. Dealloc demek farklı bir hikaye. Yorumlarda belirtildiği gibi clang referansı, dealloc yönteminizi tutmanız gerektiğini belirtir:

Gerekçe: ARC, örnek değişkenleri otomatik olarak yok etse de, alıkonulamayan kaynakların serbest bırakılması gibi bir dealloc yöntemi yazmak için hala meşru nedenler vardır. Böyle bir yöntemde [super dealloc] çağrılmaması neredeyse her zaman bir hatadır.

ARC'yi yeni bir -fobjc-arc derleyici bayrağı kullanarak etkinleştirirsiniz. ARC, Mac OS X v10.6 ve v10.7 (64 bit uygulamalar) ile iOS 4 ve iOS 5 için Xcode 4.2'de desteklenir. (Zayıf başvurular Mac OS X v10.6 ve iOS 4'te desteklenmez). Xcode 4.1'de ARC desteği yoktur.

-

ARC kullanarak iOS 5 için yeni bir uygulama geliştirirsem, bir çeşit "geriye dönük uyumluluk" kontrolü uygulamam gerekir mi? Yani: iOS sürümünü kontrol etmem ve buna bağlı olarak tutma ve bırakma çağrısında bulunmam gerekecek mi? Yani, temel olarak, ARC tüm iOS sürümleri için mi yoksa sadece iOS 5 için mi mevcut?

Hayır, çünkü ARC sihrini derleme zamanında yapar, çalışma zamanında yapmaz.

Ne zaman alıkoyma, bırakma ve otomatik serbest bırakmayı kullanacağınızı hatırlamak yerine, ARC nesnelerinizin yaşam boyu gereksinimlerini değerlendirir ve derleme zamanında sizin için uygun yöntem çağrılarını otomatik olarak ekler. Derleyici ayrıca sizin için uygun dealloc yöntemleri oluşturur.

ARC Hakkında Daha Fazla Bilgi: http://clang.llvm.org/docs/AutomaticReferenceCounting.html


Açıklamanız için teşekkürler!
Luke47

4
Bu% 100 doğru değil. ARC'nin etkin olup olmadığını belirleyen bir derleyici anahtarı vardır. Ayrıca, ARC'nin bazı çalışma zamanı desteğine ihtiyacı olduğunu düşünüyorum, bu yüzden uygulamanızın iOS 4.x üzerinde çalışmasını istiyorsanız, sürümlerinizde ve sürümlerinizde bırakmanız ve ARC'nin kapalı olduğundan emin olmanız gerekir.
JeremyP

8
@JeremyP - iOS 4.0 gerçekten de ARC uygulamaları için bir hedef olarak destekleniyor, bu nedenle bu eski platforma hitap etmek için manuel referans sayılan kodu tutmaya gerek yok. iPhone OS 3.x belki de, ancak Apple'ın 4.0'ı çıkardığında 2.x için yaptıkları gibi 5.0 gemiyi bir kez hedef platform olarak desteklemeyi bırakabileceğini hayal ediyorum.
Brad Larson

5
@Brad iOS4 için kurulum tabanı zaten% 95'ten fazla. Yine de iOS3 desteğini düşürmenin tasarruf ettiğini düşünüyorum.
Henrik P. Hessel

2
Sen çıkarmazsın dealloc, sadece bütün senin çıkar releaseve [super dealloc]ondan. Ve% dealloc99.9'da nesneleri serbest bırakır, böylece onu kaldırırsınız. Ancak nesneler hala olmayan diğer temizleme görevlerini yerine getirmelidir release(dosyaları kapatma, gözlemcileri kaldırma, vb.).
Stanislav Yaglo

8

S1: HAYIR, Varolan bir kodunuz varsa, -fno-objc-arc ile olduğu gibi kullanmaya devam edebilirsiniz. ARC'yi herhangi bir dosyada seçerek devre dışı bırakabilirsiniz.

Eğer isterseniz devre dışı ARC üzerinde BİRDEN dosyalar:

  1. Xcode'da Hedef / Derleme Aşamaları / Derleme Kaynakları'nda istediğiniz dosyaları seçin
  2. BASIN GİR . (çift tıklama yalnızca bir dosya seçer)
  3. Tip -fno-objc-yay
  4. Enter veya Done tuşuna basın

S2: HAYIR, hedef iOS 4.0 kadar düşük olabilir


7

Anladığım kadarıyla ve sırasıyla iOS 5 ve iOS 4.3 çalıştıran iPhone / iPod'um çalıştığında, hepsi oldukça otomatik. 4.0 için başladığım ve iOS 5.0 için Xcode ile çalışmak üzere "güncelledi" bir uygulama, her fırsatta, vb. Olmasına rağmen, serbest bırakma ve tutma konusunda herhangi bir uyarı alamaz. Ancak, aynı kodun bazıları (dosyayı kopyaladı), iOS 5 için Xcode ile oluşturulan yeni bir projeye çok sayıda uyarı içeriyor. Görünüşe göre tüm bu çağrıları kaldırmanız gerekmiyor ve hayır, bir şekilde eski sürümler için otomatik olarak uyarlıyor. İPod'umu profillediğimde, bellek sızıntısı veya diğer başarısız deallocs / bırakma belirtileri görmüyorum. Bu yardımcı olur mu?


En son beta sürümü aslında tüm tahsis çağrılarını kaldırmamı istiyor ve hepsi bu. Yine de tutabilir / serbest bırakabilirsiniz, ancak sistem son kelimeye sahiptir.
Dylan Gattey

5

Sorunuzun bu kısmı ile ilgili olarak

ARC kullanarak iOS 5 için yeni bir uygulama geliştirirsem, bir çeşit "geriye dönük uyumluluk" kontrolü uygulamam gerekir mi? Yani: iOS sürümünü kontrol etmem ve buna bağlı olarak tutma ve bırakma çağrısında bulunmam gerekecek mi? Yani, temel olarak, ARC tüm iOS sürümleri için mi yoksa sadece iOS 5 için mi mevcut?

İOS 5 derleyicisinin "geriye dönük uyumluluk" aldığını (aslında tutma / serbest bırakma işini yapmak için kodu ADDS eklediğini) belirtmek gerekir, ancak iOS 5.0 için derlemiyorsanız, weakanahtar kelime olarak kullanamazsınız . . Bunun yerine kullanıyorsunuz assign. Bu talihsiz bir durum: weakbüyük bir avantaj (hiç sarkan işaretçi yok!). Benim soruya bakın burada bir tartışma için weak, assignve ARC.


2

ARC'yi yeni -fobjc-arc derleyici bayrağını kullanmadan devre dışı bırakabiliyorsanız, kodu ilerlemeye devam etmek zorunda kalmazsınız - sanırım (?)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.