【问题标题】:How to define and implement properties in protocol如何在协议中定义和实现属性
【发布时间】:2010-07-31 11:27:04
【问题描述】:

我想定义一个具有很少属性的协议,并且需要在另一个 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 中工作。**

【问题讨论】:

    标签: objective-c cocoa properties protocols


    【解决方案1】:

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

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

    任何实现该协议的东西现在都需要拥有

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

    【讨论】:

    • 合成属性应该也能正常工作,因为它指示编译器提供访问器方法实现。
    • 谢谢,如果我将项目架构保持为 x86_64,您提供的代码可以完美运行。如果我将架构更改为 i386,那么我会收到以下警告:MyCustomClass.m:13: 错误:综合属性 'someObject' 必须与兼容的 ivar 命名相同,或者必须明确命名 ivar 错误:综合属性 'alive'必须与兼容的 ivar 命名相同,或者必须明确命名 ivar 我只是想知道为什么它在 x86_64 中使用 @synthesize 而不是在 i386 中工作。谢谢
    • 如果可能的话,我正在尝试编写更少的代码。还请解释一下不同架构之间的区别以及我想选择哪一个来编译应用程序。
    • x86-64 使用新的运行时,i386 使用旧的。在新的运行时 @synthesize 不需要为综合属性提供支持 ivar。
    • 那么,这是否意味着我必须使用 i386 架构编译我的应用程序才能保持 10.5 的兼容性?
    【解决方案2】:

    我认为您正在处理的事情主要是引入Objective-C 2.0 的副作用。它使您可以在不定义实例变量的情况下执行诸如声明属性之类的事情。但是(正如您所发现的),它仅与 x86_64 和 10.5 后兼容。

    【讨论】:

    • 我有类似的错误。我为 x86_64 选中了“仅构建活动架构”框。它修复了它。
    猜你喜欢
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多