Я видел, как протоколы Objective-C используются следующим образом:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Я видел, как этот формат использовался вместо написания конкретного суперкласса, который расширяют подклассы. Вопрос в том, если вы соблюдаете этот протокол, нужно ли вам синтезировать свойства самостоятельно? Если вы расширяете суперкласс, ответ, очевидно, отрицательный, в этом нет необходимости. Но как поступить со свойствами, которым протокол должен соответствовать?
Насколько я понимаю, вам все равно необходимо объявить переменные экземпляра в файле заголовка объекта, который соответствует протоколу, требующему этих свойств. В таком случае можем ли мы считать, что они всего лишь руководящий принцип? В случае необходимого метода дело обстоит иначе. Компилятор хлопнет вас по запястью, чтобы исключить требуемый метод, указанный в протоколе. Но какова история свойств?
Вот пример, генерирующий ошибку компиляции (Примечание: я обрезал код, который не отражает существующую проблему):
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProtocolsViewController.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProtocolsViewController.m
#import "TestProtocolsViewController.h"
@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.
- (void)dealloc {
[anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
[super dealloc];
}
@end
источник
Вот мой пример, который отлично работает, в первую очередь определение протокола:
Ниже приведен рабочий пример класса, поддерживающего этот протокол:
источник
все, что вам нужно сделать, это бросить
в вашей реализации, и все должно быть готово. он работает так же, как просто помещает свойство в интерфейс вашего класса.
Редактировать:
Вы можете сделать это более конкретно:
Это будет соответствовать тому, как автоматический синтез xcode создает свойства и ivars, если вы используете автосинтез, поэтому, если ваш класс имеет свойства из протокола и класса, некоторые из ваших ivars не будут иметь другой формат, который может повлиять читаемость.
источник
synthesize
было достаточно. Прохладно!Взгляните на мою статью СОБСТВЕННОСТЬ В ПРОТОКОЛЕ
Предположим, у меня есть MyProtocol, который объявляет свойство name, и MyClass, который соответствует этому протоколу.
Стоит отметить
Я не могу повторно объявить это свойство name, поскольку оно уже объявлено протоколом. Сделать это будет кричать об ошибке
Как использовать свойство в протоколе
Итак, чтобы использовать MyClass с этим свойством name, мы должны сделать либо
Снова объявите свойство (AppDelegate.h делает это)
Синтезировать себя
источник
Пример: 2 класса (Person и Serial) хотят использовать службу Viewer ... и должны соответствовать ViewerProtocol. viewerTypeOfDescription - это обязательное свойство, которому должны соответствовать классы подписчика.
Другой пример с наследованием протокола над подклассами
источник
Переменная anObject должна быть определена в определении класса TestProtocolsViewController, протокол просто информирует вас, что она должна быть там.
Ошибки компилятора говорят вам правду - переменной не существует. В конце концов, @properties - просто помощники.
источник