Vi o uso de protocolos Objective-C serem usados de uma maneira como a seguinte:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Eu já vi esse formato usado em vez de escrever uma superclasse concreta que as subclasses se estendem. A questão é: se você está em conformidade com este protocolo, precisa sintetizar as propriedades você mesmo? Se você está estendendo uma superclasse, a resposta é obviamente não, você não precisa. Mas como lidar com propriedades que um protocolo requer para se conformar?
Para meu entendimento, você ainda precisa declarar as variáveis de instância no arquivo de cabeçalho de um objeto que esteja em conformidade com um protocolo que exija essas propriedades. Nesse caso, podemos assumir que eles são apenas um princípio norteador? Claramente o mesmo não é o caso de um método necessário. O compilador dará um tapa no seu pulso por excluir um método necessário listado por um protocolo. Qual é a história por trás das propriedades?
Aqui está um exemplo que gera um erro de compilação (Nota: reduzi o código que não reflete o problema em questão):
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