Tôi đang làm việc với Box2D (C++) và tôi tạo đối tượng Objective-C và gán nó cho thuộc tính userData
của cơ thể Box2D, thuộc loại void*
.Làm thế nào để lưu trữ an toàn đối tượng id trong thành phần void C++ * trong ARC khi không có tham chiếu nào khác giữ đối tượng?
Hiện tại trong một số trường hợp, void* userData
có thể là tham chiếu hoạt động duy nhất cho đối tượng ObjC đó. Do đó, vì tôi đã sử dụng (__bridge void*)
trong nhiệm vụ, ARC sẽ cho phép nó đi. Đó là điều tôi cần sửa.
Tôi đã cân nhắc các tùy chọn để ngăn điều này xảy ra? Tôi đọc Clang's ARC documentation, đặc biệt là các bộ phận về đúc cầu (cũng như Q & A trên SO) cũng như gật đầu với các cấu trúc đúc cầu khác nhau mà chúng coi là "hình thành không đúng".
Tuy nhiên, suy nghĩ đầu tiên của tôi là sử dụng (__bridge_retained void*)
trong gán ban đầu cho userData. Nhưng điều đó khiến tôi băn khoăn làm thế nào để cân bằng được sự giữ lại đó? Tôi rõ ràng không thể gửi bản phát hành cho đối tượng.
Vì vậy, tôi có phải CFRelease()
đối tượng không? Hay nó cần phải là CFBridgingRelease()
? Hoặc cả hai đều là bất hợp pháp ở đây?
Có phải là (__bridge_transfer void*)
truyền từ userData
sang loại id tạm thời đủ, có lẽ trong khi đặt userData thành NULL sau đó? Đó có phải là một ý tưởng hay không?
Tôi biết cách thay thế sẽ là giữ riêng một đối tượng userData
cho các đối tượng userData
và giữ chúng đồng bộ với tuổi thọ của thân Box2D, thêm và xóa chúng đồng bộ với thân Box2D của chúng. Tuy nhiên, điều này cảm thấy như quá mức cần thiết vì ở đây tôi biết những gì tôi đang làm, tôi biết tôi cần phải +1
đối tượng miễn là cơ thể Box2D hoạt động, và -1
đối tượng khi cơ thể Box2D được lấy ra. Ngoài ra, tôi biết rằng chỉ có hai phương thức mà các đối tượng Box2D được thêm vào và loại bỏ, và truy cập trực tiếp vào userData
thậm chí không thể trong khung của tôi vì tất cả các đối tượng Box2D được ẩn đằng sau các giao diện/trình bao Objective-C.
Thiết lập có thể "không thành hình" sang một bên, bạn sẽ khuyên bạn nên làm gì trong tình huống này?
@Emil: cảm ơn bạn đã sửa mã nội tuyến, tôi chỉ muốn tự làm. – LearnCocos2D
Không có vấn đề gì, tôi phải thừa nhận rằng thật lạ khi chỉnh sửa một thứ tầm thường như vậy trong bài đăng của người dùng 20k! Ha: D – Emil
vâng đôi khi tôi hỏi những câu hỏi thực sự khó hiểu :) – LearnCocos2D