Tôi có một khu vực malloc'd lớn mà tôi muốn bọc trong một đối tượng NSData. Một thời gian sau, tôi tạo một bản sao của đối tượng NSData đó. Tôi muốn hai đối tượng NSData sống đời sống độc lập. ARC tự chăm sóc các đối tượng NSData, nhưng tôi đang cố gắng làm rõ tuổi thọ của chứa vùng malloc'd. Dưới đây là một mã số phác thảo:Nội dung của NSData có được tham chiếu riêng biệt không?
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
Đó là OK với tôi rằng copyWithZone không sâu sao chép các vùng malloc'd - Tôi có thể sử dụng [NSData dataWithData:]
nếu tôi muốn có một bản sao sâu. Điều gì không rõ ràng với tôi (và tôi không chắc chắn làm thế nào tốt nhất để kiểm tra) là đối tượng NSData sở hữu bộ đệm malloc'd cơ bản? Nếu cả hai đều giữ một tham chiếu đến bộ đệm malloc'd (sử dụng một số hình thức đếm tham chiếu mờ) đó là tuyệt vời! Nhưng nếu bộ đệm malloc'd được giải phóng khi đối tượng data
được giải phóng (như ngụ ý bởi freeWhenDone:YES
), data2
sẽ gặp sự cố trên tay.
Ai đó có thể giải thích NSData trong trường hợp này là gì? Ngoài ra, ai đó có thể đề xuất một thử nghiệm dứt khoát để chứng minh cho chính mình những gì đang xảy ra?
Để có thời gian tốt, hãy ghi lại địa chỉ con trỏ của dữ liệu và dữ liệu2. 'NSLog (@"% p% p ", dữ liệu, dữ liệu2);' ;-) –
@MatthiasBauch: bạn có ý giống như dòng cuối cùng trong ví dụ? :-) (Tôi đã sử dụng 'printf' thay vì' NSLog') –
"Nếu CÓ, đối tượng trả về sẽ sở hữu con trỏ byte và giải phóng nó trên deallocation." Điều đó nói với tôi rằng bạn nên không tin vào bộ đệm còn sống sót vượt ra ngoài cuộc đời của NSData đầu tiên. Tuy nhiên, có lẽ NSData thứ hai tăng số lượng tham chiếu của NSData đầu tiên, vì vậy NSData đầu tiên sẽ không đi poof cho đến khi NSData thứ hai thực hiện. (Trong không phải ARC bạn có thể kiểm tra số tham chiếu để kiểm tra điều này.) –