2012-01-01 27 views
5
Ben bir düzeltme uzunluğu değişken içerik paylaşılan veri tamponunu istiyorum

ve ben bu oluştururum nasıl:Davranış: uzunluk: freeWhenDone:

void *buffer = malloc(length); 
// initialize buffer content 
NSData *sharedData = [[NSData alloc] initWithBytesNoCopy:buffer length:length freeWhenDone:YES] 

Ya bir oluşturduktan sonra ben buffer değiştirmek durumunda ne NSData ondan? NSData, buffer'a yaptığım değişikliği yansıtıyor mu?

buffer'u değiştirmek istediğimde sharedData'un dealloc alamayacağını garanti edebilirim.

Bu

Aslında kullanmak istiyorum nasıl:


void *my_alloc(CFIndex allocSize, CFOptionFlags hint, void *info) {return NULL;} 
void my_dealloc(void *ptr, void *info) { 
    mach_vm_deallocate(mach_task_self(), (mach_vm_address_t)ptr, (size_t)info); 
} 

size_t length = //some number 
mach_vm_address_t buffer; 
mach_vm_allocate(mach_task_self(), &buffer, length, VM_FLAGS_ANYWHERE); 
// do something to buffer, for example pass to other process using mach RPC and expect other process will modify the content 
CFAllocatorContext context = {0, (void *)length, NULL, NULL, NULL, my_alloc, NULL, my_dealloc, NULL}; 
CFAllocatorRef allocator = CFAllocatorCreate(NULL, &context); 
CFDataCreateWithBytesNoCopy(NULL, (const UInt8 *)buffer, length, allocator); 

cevap

7

initWithBytesNoCopy: etkin mevcut tampon etrafında NSData sarıcı yaratacak; Evet, [sharedData bytes] aracılığıyla erişen şeyler yaptığınız güncellemeleri görecek. Tabii

, bu örneğin bir [NSImage initWithData:sharedData] herhangi bir değişiklik yansıtmaz NSImage Örneğin, bir kopyasını yapabilir, böylece NSData örneğinden oluşturulan diğer nesneleri bağlamak için hiçbir şey yapmaz. NSData son başvuru kaldırılır tampon yok, yani bunun için dikkat edecek freeWhenDone:YES ile de

, =) Böylece


, NSData bir malloc() ayırma etrafında ince bir sargı etkili bir şekilde göz önüne alındığında bu evet, o belleğe yapılan değişiklikleri yansıtır (herhangi bir işlemle); ancak üzerinde free() arayacağı gibi, freeWhenDone:YES ile başka bir yol (mach_vm_allocate) oluşturulan bir arabellek sarmak için kullanmak kötü bir fikir.

gerçekten-gerçekten özel bir ayırıcısı kullanmak gerekmiyorsa, sana ile daha iyi olacağını düşünüyorum (neden?):

NSMutableData* sharedData = [NSMutableData dataWithCapacity:length]; 
// `dataWithLength:` will fully allocate and zero the buffer first, if you prefer 
void* buffer = [sharedData mutableBytes]; 
// do something to `buffer`, mach RPC, etc. 
// 3: profit.