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
fonte
Aqui está um exemplo meu que funciona perfeitamente, a definição do protocolo antes de tudo:
Abaixo está um exemplo de trabalho de uma classe que suporta este protocolo:
fonte
tudo o que você precisa fazer é soltar um
em sua implementação e você deve estar pronto. funciona da mesma maneira que apenas colocar a propriedade na interface da classe.
Editar:
Você pode fazer isso mais especificamente:
Isso ficará alinhado com o modo como a síntese automática do xcode cria propriedades e ivars se você usar a auto-síntese, de modo que, se sua classe tiver propriedades de um protocolo e uma classe, alguns de seus ivars não terão o formato diferente que pode afetar legibilidade.
fonte
synthesize
suficiente. Legal!Dê uma olhada no meu artigo PROPRIEDADE NO PROTOCOLO
Suponha que eu possua MyProtocol que declara uma propriedade de nome e MyClass que esteja em conformidade com este protocolo
Coisas dignas de nota
Não consigo redefinir essa propriedade de nome, como já declarada pelo protocolo. Faça isso gritará um erro
Como usar a propriedade no protocolo
Então, para usar MyClass com essa propriedade name, precisamos fazer
Declare a propriedade novamente (AppDelegate.h faz dessa maneira)
Sintetizar a nós mesmos
fonte
Exemplo: 2 classes (Pessoa e Serial) desejam usar o serviço do Viewer ... e devem estar em conformidade com o ViewerProtocol. viewerTypeOfDescription é uma propriedade obrigatória que as classes de assinante devem obedecer.
Um outro exemplo com herança de protocolo sobre subclasse
fonte
A variável anObject precisa ser definida na sua definição de classe TestProtocolsViewController, o protocolo está apenas informando que deve estar lá.
Os erros do compilador estão dizendo a verdade - a variável não existe. Afinal, @properties são apenas ajudantes.
fonte