NSData nesnesine sarmak istediğim büyük bir bölgem var. Bir süre sonra, o NSData nesnesinin bir kopyasını yaparım. İki NSData nesnesinin bağımsız bir yaşam sürmesini istiyorum. ARC, NSData nesnelerini yeniden saymayı önemser, ancak içeren malloc'd bölgesi'un ömrünü açıklığa kavuşturmaya çalışıyorum. İşte bir kod taslak verilmiştir:NSData içeriği ayrı olarak referans sayılıyor mu?
float* cubeData = (float*)malloc(cubeDataSize);
printf("cubeData=%p\n", cubeData);
// cubeData=0x01beef00
for (...) { /* fill the cubeData array */ }
NSData* data = [NSData dataWithBytesNoCopy:cubeData length:cubeDataSize
freeWhenDone:YES];
NSData* data2 = [data copyWithZone:nil]
printf("data.bytes=%p data2.bytes=%p\n", data.bytes, data2.bytes);
// data.bytes=0x01beef00 data2.bytes=0x01beef00
Benim için sorun malloc'd bölgeyi derin kopya etmediğini copyWithZone - Derin kopyasını istiyorsanız ben [NSData dataWithData:]
kullanabilirsiniz. Bana açık olmayan (ve nasıl en iyi şekilde test edileceğinden emin değilim), hangi NSData nesnesinin temel malloc'd arabelleğine sahip olduğudır? Her ikisi de malloc tamponuna bir referans tutuyorsa (bir çeşit opak referans sayımı kullanarak) bu harika! Ancak, data
nesnesi (freeWhenDone:YES
tarafından belirtildiği gibi) yayımlandığında malloc tampon boşalırsa, data2
ellerinde sorun yaşayacaktır.
NSData bu durumda ne yaptığını açıklayabilir mi? Alternatif olarak, birileri bana neler olduğunu kanıtlamak için kesin bir test önerebilir mi? altta yatan soru için
Veri ve veri için işaretçi adresini iyi bir şekilde kaydedin. NSLog (@ "% p% p", veri, data2) ;-) ;-) –
@MatthiasBauch: Örnekteki son satır gibi mi demek istiyorsunuz? :-) ("NSLog" yerine printf "kullandım) –
" YES ise, döndürülen nesne bayt işaretçisinin sahipliğini alır ve ayrılmadan serbest bırakır. " Bu bana, ilk NSData'nın ömrünün ötesinde hayatta kalan tampona güvenmemen gerektiğini söyledi. Ancak, muhtemelen ikinci NSData ilk NSData'nın referans sayısını artırır, bu nedenle ilk NSData ikinci olana kadar poof olmayacaktır. (ARC olmayanlarda bunu kontrol etmek için referans sayılarını test edebilirsiniz.) –