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
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.
Hangi koşullar altında bir JSESSİONİD ...
Hangi şartlar altında bir SqlConnectio...
Hangi şartlar altında bağlı listeler y...
Hangi dosya Sürüm Kontrol altında tutu...
Nasıl SIGSEGV (segment hatası) binebil...