如何在协议中定义和实现属性

时间:2010-07-31 11:27:05

标签: objective-c cocoa properties protocols

我想定义一个具有少量属性的协议,并且需要在另一个NSObject子类中使用这些属性。请给我链接或示例代码。我需要使用10.5。

由于     请检查以下示例代码

@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

**添加了: 使用x86_64架构编译代码工作正常。但是如果我将架构更改为i386,那么我会收到以下警告:

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

我只是想知道它为什么在x86_64中使用@synthesize而不是在i386中工作。**

2 个答案:

答案 0 :(得分:35)

@property只是告诉编译器,该类应该定义匹配该属性的方法。

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

现在需要实现该协议的任何内容

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

答案 1 :(得分:1)

我认为你所处理的事情主要是引入Objective-C 2.0的副作用。它允许您执行诸如声明属性之类的操作,而无需定义实例变量。但是(正如你所发现的那样),只有x86_64和10.5后兼容。