Рассмотрите этот класс: CAEmitterLayer
. Этот класс отвечает на свойство name
.Почему методы и свойства протокола скрываются от суперкласса?
Теперь я создал CAEmitterLayer
под названием MyEmitter
, и этот класс соответствует протоколу, который я создал под названием MyProtocol
.
MyEmitter
объявление класса, как это:
HEADER
#import "MyProtocol.h"
@interface MyEmitter : CAEmitterLayer <MyProtocol>
@end
РЕАЛИЗАЦИЯ
#import "MyEmitter.h"
@implementation MyEmitter
@synthesize internalString = _internalString;
@end
и протокол только это:
@protocol MyProtocol <NSObject>
@property (nonatomic, strong) NSString * internalString;
@end
В этом проблема. Если я создаю новый объект, как этот
MyEmitter *obj = [[MyEmitter alloc] init];
и попытаться использовать name
свойство, Xcode жалуется не известный метод экземпляра для селекторного «имя»
На самом деле я не могу получить доступ к любой собственности от класс CAEmitterLayer
даже MyEmitter
является подклассом этого класса.
Я пытаюсь использовать его как это:
for (id <MyProtocol> node in nodes) {
[node setName:@"ddd"]; // error here
}
Видимо протокол скрывает все от суперкласса. Почему это и как я могу решить?
ПРИМЕЧАНИЕ. Мне пришлось добавить эту синтезирующую строку в класс, иначе xcode не перестанет жаловаться.
Покажите, как вы пытаетесь использовать его, на самом деле он использует 'obj' из вашей кодовой строки? Можете ли вы получить доступ к 'internalString' без ошибок? И да, свойства протокола всегда должны быть синтезированы (или переопределены). – Wain
добавлен в вопрос .... да, я могу получить доступ к internalString. – SpaceDog
Я не могу получить доступ к любому свойству CAEmitterLayer ... – SpaceDog