2015-01-06 12 views
5

Nếu tôi có một tài sản như thế này:Quản lý bộ nhớ có thể thay đổi thuộc tính nếu được định nghĩa lại trong một tiện ích mở rộng lớp không?

//test.h 

@interface test 
@property (nonatomic, readonly, weak) NSObject x; 
@end 

định nghĩa lại trong file thực thi để được đọc/ghi:

// test.m 
@interface test() 
@property (nonatomic, readwrite) NSObject x; 
@end 

Tôi đã từng yếu trong .h, nhưng tôi không nói gì trong phần mở rộng, liệu tài sản có giữ nguyên chỉ số 'yếu' hay nó sẽ chuyển thành 'mạnh'?

Từ khóa có mạnh/gán/yếu sẽ bị ghi đè khi thuộc tính được xác định lại không?

+0

Thông thường, tôi luôn chỉ định thuộc tính 'strong/weak/assign' của thuộc tính trong tiện ích mở rộng lớp. Nó không cần thiết trong tuyên bố công khai chỉ đọc. – rmaddy

+0

@rmaddy - Khai báo chỉ 'readonly' trong' .h' và 'readwrite, weak' trong phần mở rộng của lớp trong' .m' cho "Khai báo thuộc tính chính là hoàn toàn mạnh trong khi việc redeclaration trong phần mở rộng lớp là yếu" dưới Xcode 5.1 .1. Tuy nhiên, bao gồm 'strong' hoặc' assign' trong phần mở rộng không làm tăng ire của trình biên dịch. Trình biên dịch sau có thay đổi điều này không? – CRD

+0

@CRD Hmmm. Tôi đoán tôi đã không làm điều đó với các thuộc tính 'yếu '. Tốt để biết. – rmaddy

Trả lời

5

Một thử nghiệm đơn giản với Xcode 5.1.1 cho thấy thuộc tính weak được lưu giữ. Điều này cũng đúng với các thuộc tính assignstrong - bạn có thể chỉ định chúng trong số .h và bỏ qua chúng trong số .m, nếu bạn đưa chúng vào số .m thì cả hai phải khớp nhau.

Có nói rằng, tôi không biết nếu điều này được ghi lại ở bất cứ đâu. Nhưng sau đó ngữ nghĩa của Mục tiêu-C không được định nghĩa chính thức ở bất kỳ đâu. Vì vậy, sử dụng có nguy cơ của riêng bạn.

Đề xuất: chỉ cần lặp lại.

+0

cách bạn kiểm tra xem thuộc tính có được đặt không? Tôi đang cố tìm cách kiểm tra những thứ này. Cảm ơn! – Wingzero

+0

Tại thời gian biên dịch chỉ cần đọc '.h'; cho tra cứu thời gian chạy hàm 'property_getAttributes' trong tài liệu. – CRD

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