SORU
14 Ocak 2012, CUMARTESİ


Hangi durumlarda ARK altında __autoreleasing sahipliği niteleyici yazmaya gerek var mı?

Bulmacayı tamamlamak için çalışıyorum.

__strong Objective-C retainable NSObject, NSString gibi nesne işaretçileri, vb. güçlü bir referans her şey için varsayılan değer budur. ARC kapsamı sonunda -release ile dengeler.

__unsafe_unretained eski yol eşittir. Retainable nesne tutulmadan, zayıf bir işaretçi için kullanılır.

__weak otomatik sıfırlama zayıf bir başvuru işaretçisi başvurulan nesneyi ayırmanın en kısa sürede sıfıra ayarlanır yani bu hariç __unsafe_unretained gibidir. Bu sarkan işaretçiler ve EXC_BAD_ACCESS hataları tehlikesini ortadan kaldırır.

Ama tam olarak __autoreleasing neye iyi gelir? Zor zamanlar bu niteleyici kullanmak için ihtiyacım olduğunda pratik örnekler bulmakta zorlanıyorum. İşaretçi işaretçi böyle bir olarak bekledikleri işlevleri ve yöntemleri için sadece olduğuna inanıyorum:

- (BOOL)save:(NSError**);

ya

NSError *error = nil;
[database save:&error];

ARK altında bu şekilde ilan edilmelidir:

- (BOOL)save:(NSError* __autoreleasing *);

Ama bu çok belirsiz ve tam olarak anlamak istiyorumneden. Bulduğum kod parçacıkları __autoreleasing bu arasındakileri bana garip görünen iki yıldız, yer. Türü NSError** (NSError için işaretçi işaretçi), o zaman neden __autoreleasing yıldızlar senin için yapmayacağım ve sadece NSError** önünde yer?

Ayrıca __autoreleasing güvenmek zorundayım başka durumlar olabilir.

CEVAP
14 Ocak 2012, CUMARTESİ


Haklısın. Resmi belgelere şöyle açıklıyor:

__referans (ıd *) tarafından geçirilen bağımsız değişkenleri belirtmek için ve dönüşünde autoreleased vardır autoreleasing.

Tüm bu ARC transition guide çok iyi anlatıyor.

NSError örnek, Bildirgesi __strong, örtülü demektir

NSError * e = nil;

Dönüştürülmüş olacak:

NSError * __strong error = nil;

save yöntemi:

- ( BOOL )save: ( NSError * __autoreleasing * );

Derleyici o zaman geçici bir değişken __autoreleasing set oluşturmak zorunda. Yani:

NSError * error = nil;
[ database save: &error ];

Dönüştürülmüş olacak:

NSError * __strong error = nil;
NSError * __autoreleasing tmpError = error;
[ database save: &tmpError ];
error = tmpError;

** 29, direkt olarak hata nesnesi bildirerek bu kaçının.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Adams

    Bryan Adams

    30 Mart 2006
  • majesticdubstep

    majesticdubs

    3 Kasım 2011
  • monkophile

    monkophile

    25 Temmuz 2007