2010-06-18 27 views
5

Başka birinin kodunu inceledim ve sahip olmadıkları bir NSString'de 'release' olarak adlandırıldıklarını fark ettim (hiçbir zaman hiçbir yerde tahsis/tutma/kopyalama ve mülk olmadı). Bu bana biraz garip geldi ve bana 'sahip' olmayan ya da ref sayısı zaten 0 olan bir nesne üzerinde 'bırakma' dediğinizde garip bir davranış ortaya çıkabilir mi diye merak ettim mi? Aşağıdaki kod uyarıları olmadan derler/çalışır, bu yüzden sorun yok sanırım ama sadece merak ettim.'Release' çağrısı çok mu fazla?

// Releasing an object I don't own 
NSString *notMyString = [NSString stringWithString:@"Not mine."]; 
[notMyString release]; // Ignored? 

// Releasing an object I own, twice 
NSString *myString = [[NSString alloc] initWithString:@"Mine."]; 
[myString release]; // Ref count = 0 
[myString release]; // Ref count = ? 
+2

Kodun "işleyişinin" nedeni, NSString'in -initWithString'in: iletilen dizenin sabit bir dize olduğunun ve dolayısıyla yeni bir ayırmaya gerek duyulmamasıdır. Sabit dizeler tutma/bırakmayı etkin bir şekilde göz ardı ettiğinden, kod tesadüfi olarak çalışır. – bbum

cevap

15

Evet, bunu yapma. Sahiplik kuralları hakkında anlayışınız olduğu gibi, değerlendirmeniz doğrudur. Zaten serbest bırakılmış bir nesneye mesaj göndermek tanımlanmamış bir davranışa sahiptir - bazen diğer şeyler nedeniyle şansınız olur ve hiçbir şey olmaz. Bazen hemen çökersiniz, bazen daha sonra başka bir şeyleri bozduğunuz için.

+2

Evet, endişelendiğim uzun vadeli davranış. Her zaman rastgele blog 'öğretici' kodu as-is =) güvenemezsiniz sanırım. Hızlı cevap için teşekkürler. – nebs