2013-02-04 16 views
10

Tôi đang lưu trữ Chipmunk Vật lý cpShape đối tượng trong một NSMutableDictionary bằng cách NSValue các đối tượng và các dòng mã sau đây:Chuyển đổi NSValue về kiểu cấu trúc đã được lưu trữ trong đó?

NSValue *shapeValue = [[NSValue alloc] initWithBytes: shape objCType: @encode(cpShape)]; 
[staticBodiesInUse setObject: shapeValue forKey: name]; 

bây giờ tôi cần phải nhận được cpShape trở ra, để so sánh nó với hình dạng khác. Làm thế nào tôi có thể làm điều đó? Tôi thấy một phương pháp getValue: trong NSValue nhưng nó cần một bộ đệm, không quá chắc chắn phải làm gì với nó.

Trả lời

12

Vì vậy, câu trả lời bằng cách trojanfoe là chỉ đúng một phần.

Có một sự cố lớn khi thực hiện việc đó. Khi bạn tạo NSValue theo cách đó, bạn đang sao chép cấu trúc cpShape và rút lại, bạn sẽ sao chép lại. cpShape cấu trúc được sử dụng khá độc đáo theo tham chiếu. Mỗi khi bạn sao chép nó, bạn sẽ có được một tham chiếu mới cho bản sao mới, và một số bản sao đó tồn tại trên ngăn xếp và bị tiêu hủy âm thầm và tự động. Rất rất tệ.

Thay vào đó bạn muốn tạo NSValue sử dụng [NSValue valueWithPointer:shape] và đưa con trỏ đó trở lại sử dụng [value pointerValue]. Bằng cách này, NSValue chỉ lưu trữ một con trỏ đến số cpShape gốc.

+0

Và sử dụng 'cpShape *' là * vấn đề miễn phí *? Tôi không nghĩ như vậy và sẽ dẫn đến lỗi ngấm ngầm trừ khi sử dụng rất cẩn thận. – trojanfoe

+0

@slembcke bạn có thể xây dựng thêm một chút về lý do tại sao tạo bản sao của cấu trúc trong khung ngăn xếp hiện tại không tốt (hoặc tệ hơn là truyền xung quanh con trỏ tới cấu trúc)? Hay đó là do cách thức hoạt động của chipmunk? – dev

6

Không phải là nó chỉ đơn giản:

NSValue *value = [staticBodiesInUse objectForKey:name]; 
cpShape shape; 
[value getValue:&shape]; 
+0

Nó sẽ xuất hiện như vậy, có. Tôi đã bỏ lỡ lớp tham chiếu, rõ ràng;) – Luke

Các vấn đề liên quan