Vấn đề
Tôi đã đi qua một vấn đề thú vị và đã không thể tìm thấy bất kỳ tài liệu về nó ... Đôi khi properties
tuyên bố trong một không được triển khai trong một lớp cụ thể phù hợp với điều đó và ngoại lệ thời gian chạy xảy ra. Có phải dynamic property
định nghĩa được tối ưu hóa trong một số trường hợp lạ? Có thể protocols
không được sử dụng với properties
đã được khai báo là dynamic
không? Bất kỳ cái nhìn sâu sắc vào điều này sẽ được đánh giá rất nhiều.obj-c tính giao thức không được thực hiện trong lớp Tuân thủ
Dưới đây là một số chi tiết khác.
Cho một :
@protocol MyProtocol <NSObject>
@property (nonatomic, strong) id someProperty;
@end
và một lớp học thực hiện như vậy:
@interface MyClass <MyProtocol>
@end
@implementation MyClass
@dynamic someProperty;
@end
tôi đã nhận thấy rằng đôi khi tôi không thể nhận được bất kỳ thông tin từ gọi
class_getProperty(myClass, propertyName);
cho số properties
trong số . Điều này chỉ xảy ra với một số lớp học và dường như không thường xuyên.
Tôi đang chạy Xcode 4 mới nhất và liên kết với SDK iOS 6. Tôi có Xcode 5 trước khi phát hành được cài đặt trên cùng một máy mặc dù nó không phải là mặc định (thông qua xcode-select).
Ví dụ
Nếu bạn chạy mã này:
@protocol MyProtocol <NSObject>
@property (nonatomic, strong) id someData;
@end
@interface MyObject : NSObject <MyProtocol>
@end
@implementation MyObject
@dynamic someData;
@end
và sau đó bạn chạy
const char *name = [@"someData" UTF8String];
objc_property_t property = class_getProperty([MyObject class], name);
const char *attributes = property_getAttributes(property);
bạn sẽ nhận được dữ liệu meta trên property
mặc dù property
doesn' t tồn tại. Nói cách khác, bạn không cần phải tổng hợp thuộc tính để lấy thuộc tính của nó là. Thời gian chạy vẫn biết về nó. Hãy thử nó cho chính mình. Vấn đề là đôi khi điều này không xảy ra. Tôi muốn biết các điều kiện khiến thời gian chạy không biết thuộc tính property
.
Temporary Fix
sửa chữa tạm thời của tôi là chỉ cần sao chép tất cả các property
định nghĩa trong và dán chúng vào các file .h:
@interface MyClass <MyProtocol>
@property (nonatomic, strong) id someProperty;
@end
@implementation MyClass
@dynamic someProperty;
@end
này chạy tốt, mặc dù nó là xa lý tưởng. Tuy nhiên, nó cho thấy rằng mã của tôi đang hoạt động chính xác và vấn đề nằm ở nơi khác.
Tôi rất sẵn lòng cung cấp thêm chi tiết hoặc nền nếu cần.
Thời gian chạy không tối ưu hóa bất cứ điều gì. Điều duy nhất có thể tối ưu hóa là trình biên dịch (và đôi khi là trình liên kết), nhưng không phải vậy. Giao thức chỉ là một tập hợp các khai báo, không có định nghĩa nào bên trong. ** Bạn ** phải cung cấp chúng, hoặc bằng cách tổng hợp các tài sản hoặc bằng cách thực hiện accessor và mutator bằng tay. –
Nhân tiện, đây không phải là câu hỏi về Xcode. –
Mã bạn mô tả được cho là hoạt động. Nếu bạn có thể viết một bài kiểm tra không hoạt động, vui lòng gửi báo cáo lỗi và bao gồm bài kiểm tra đó. –