Как определить и реализовать свойства в протоколе - PullRequest
19 голосов
/ 31 июля 2010

Я хочу определить один протокол с несколькими свойствами, и мне нужно использовать эти свойства в другом подклассе 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 ]

35 голосов
/ 31 июля 2010

@property просто говорит компилятору, что класс должен определить методы, соответствующие этому свойству.

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

Все, что реализует этот протокол, теперь должно иметь

- (id)someObject;
- (BOOL)isAlive;
- (void)setAlive:(BOOL)aBOOL;
1 голос
/ 23 апреля 2011

Я думаю, что вы имеете дело с побочными эффектами введения Objective-C 2.0 .Это позволяет вам делать такие вещи, как объявление свойств, без определения экземпляров переменных.Но (как вы обнаружили) он совместим только с x86_64 и после 10.5.

...