2010-07-31 25 views
17

Tôi muốn xác định một giao thức có ít thuộc tính và cần phải sử dụng các thuộc tính đó trong một lớp con NSObject khác. Vui lòng cho tôi liên kết hoặc mã ví dụ. Tôi cần điều đó để làm việc với 10.5.Cách xác định và thực hiện các thuộc tính trong giao thức

Cảm ơn XIN kiểm tra như sau MẪU MÃ

@protocol MyProtocol 
@property (nonatomic, readonly) id someObject; 
@property (nonatomic, getter=isAlive) BOOL alive; 
@end 

#import "MyProtocol.h" 
@interface MyCustomClass : NSObject <MyProtocol>{ 

} 
@end 

#import "MyCustomClass.h" 
@implementation MyCustomClass 
@synthesize someObject,alive; 

/* 
- (id)someObject { 
    return nil; 
} 

- (BOOL)isAlive { 
    return YES; 
} 

- (void)setAlive:(BOOL)aBOOL { 
} 
*/ 
@end 

** Added: compling mã với kiến ​​trúc x86_64 hoạt động tốt. Nhưng lỗi nếu tôi sẽ thay đổi kiến ​​trúc để i386, sau đó tôi nhận được cảnh báo sau đây:.

MyCustomClass.m:13: error: synthesized property 'someObject' must either be named the same as a compatible ivar or must explicitly name an ivar 

error: synthesized property 'alive' must either be named the same as a compatible ivar or must explicitly name an ivar 

Tôi chỉ muốn biết lý do tại sao nó được làm việc trong x86_64 với @synthesize và không có trong i386 **

Trả lời

33

@property chỉ nói với trình biên dịch rằng lớp được mong đợi sẽ xác định các phương thức để khớp với thuộc tính đó.

@protocol MyProtocol 
@property (nonatomic, readonly) id someObject; 
@property (nonatomic, getter=isAlive) BOOL alive; 
@end 

Bất cứ điều gì thực hiện giao thức mà bây giờ sẽ cần phải có

- (id)someObject; 
- (BOOL)isAlive; 
- (void)setAlive:(BOOL)aBOOL; 
+9

Việc tổng hợp các thuộc tính cũng hoạt động, vì nó hướng dẫn trình biên dịch cung cấp các triển khai phương thức truy cập. –

+0

Cảm ơn, mã được cung cấp của bạn hoạt động hoàn hảo, nếu tôi giữ kiến ​​trúc dự án với x86_64. Nếu tôi thay đổi kiến ​​trúc thành i386 thì tôi nhận được các cảnh báo sau đây: MyCustomClass.m: 13: error: thuộc tính tổng hợp 'someObject' phải được đặt tên giống như một ivar tương thích hoặc phải đặt tên một ivar lỗi: tổng hợp property 'alive' phải được đặt tên giống như một ivar tương thích hoặc phải đặt tên rõ ràng là ivar Tôi chỉ muốn biết tại sao nó hoạt động trong x86_64 với @synthesize chứ không phải trong i386. Cảm ơn – AmitSri

+0

Tôi đang cố viết ít mã hơn nếu có thể. Xin vui lòng cũng giải thích cho tôi sự khác biệt giữa các kiến ​​trúc khác nhau là gì và tôi giả sử để chọn để biên dịch ứng dụng. – AmitSri

1

Tôi nghĩ những điều bạn đang làm việc với những tác động chủ yếu bên của sự ra đời của Objective-C 2.0. Nó cho phép bạn làm những việc như khai báo các thuộc tính mà không cần định nghĩa các cá thể vars. Nhưng (như bạn đã phát hiện ra), nó chỉ là x86_64 và post-10.5 tương thích.

+0

Tôi gặp lỗi tương tự. Tôi đã chọn hộp "chỉ xây dựng kiến ​​trúc hoạt động" cho x86_64. Nó cố định nó. – user523234

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