SORU
1 EKİM 2008, ÇARŞAMBA


Nesne ve Nesnel C tahsis init

Tahsis ve init için aşağıdaki 2 yolu bir nesne arasındaki fark nedir?

AController *tempAController = [[AController alloc] init];
self.aController = tempAController;
[tempAController release];

ve

self.aController= [[AController alloc] init];

Apple örneği çoğu, ilk yöntemini kullanın. Neden ayırmak, init ve nesne ve serbest hemen sonra miydin?

CEVAP
1 EKİM 2008, ÇARŞAMBA


Her nesne bir başvuru sayısı vardır. 0, nesne gittiği zaman ayırmanın.

Özelliği @property (retain) olarak ilan edildi varsayarsak:

İlk örnek, satır satır:

  1. Nesne 1 bir başvuru sayısı vardır alloc tarafından oluşturulur.
  2. Nesne teslim selfsetAController: yöntem, hangi gönderir retain ileti (çünkü bu yöntem bilmiyor nesne geliyor), artan başvuru sayısı 2.
  3. Arama kodu artık release 1-başvuru sayısı azaltma çağırır nesnenin kendisi olmalıdır.

İkinci örnek, temel adımlar 1 ve nesnenin başvuru sayısı 2 sonunda 3, 2 değil.

Kural eğer bir nesne oluşturursanız, o bitince serbest için sorumlu olmasıdır. Sizin örnekte, kod özelliği ayarlar sonra tempAController ile yapılır. Ayrılmamak için nesne eğer ihtiyacı varsa retain aramak için ayarlayıcı yöntemi görevidir.

Önemli Objective-C self.property = foo; gerçekten [self setProperty:foo]; sadece steno ve setProperty: yöntem veya gerektiği gibi nesneleri kopyalama istinat olacağını hatırlamak önemlidir.

Eğer özelliği @property (copy), o zaman ilan edilirse nesne yerine kopyalanan muhafaza edilmiştir. İlk örnekte, orijinal nesnenin hemen serbest kalır; ikinci örnekte, orijinal nesnenin başvuru sayısı 0 olması gerektiği halde 1 olur. Hala kod aynı şekilde yazmak isterim.

Eğer özelliği @property (assign) self ilan edildi, nesnenin sahipliğini iddia değil, başkasının da onu korumak gerekir. Bu durumda, ilk örnek yanlış olur. Özellikleri Bu tür nadir, genellikle tek bir nesne delegeler için kullanılır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • incognitotraveler

    incognitotra

    27 Mayıs 2010
  • Mr_BrettHooge

    Mr_BrettHoog

    3 Ocak 2011