iphone - technology - xcode documentation




Como lidar com protocolos Objective-C que contêm propriedades? (4)

Eu vi uso de protocolos Objective-C se acostumar de uma forma como o seguinte:

@protocol MyProtocol <NSObject>

@required

@property (readonly) NSString *title;

@optional

- (void) someMethod;

@end

Eu vi esse formato usado em vez de escrever uma superclasse concreta que as subclasses estendem. A questão é, se você está em conformidade com este protocolo, você 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 adequar?

No meu entender, 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 orientador? CLearly o mesmo não é o caso de um método obrigatório. O compilador vai dar um tapa no seu pulso por excluir um método obrigatório que um protocolo lista. Qual é a história por trás das propriedades?

Aqui está um exemplo que gera um erro de compilação (Nota: eu aparado o código que não reflete sobre 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     

A variável, anObject, precisa ser definida em 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. @properties são apenas ajudantes, afinal.


Aqui está um exemplo meu que funciona perfeitamente, a definição do protocolo em primeiro lugar:

@class ExampleClass;

@protocol ExampleProtocol

@required

// Properties
@property (nonatomic, retain) ExampleClass *item;

@end

Abaixo está um exemplo funcional de uma classe que suporta este protocolo:

#import <UIKit/UIKit.h>
#import "Protocols.h"

@class ExampleClass;

@interface MyObject : NSObject <ExampleProtocol> {

    // Property backing store
    ExampleClass        *item;

}


@implementation MyObject

// Synthesize properties
@synthesize item;

@end

O protocolo é apenas dizer a todos que conhecem sua classe através do protocolo, que a propriedade anObject estará lá. Os protocolos não são reais, eles não têm variáveis ​​ou métodos em si - eles descrevem apenas um conjunto específico de atributos que são verdadeiros sobre sua classe, de modo que os objetos que contêm referências a eles possam usá-los de maneiras específicas.

Isso significa que na sua classe que está de acordo com o seu protocolo, você precisa fazer tudo para garantir que umObjeto funcione.

@property e @property estão no coração de dois mecanismos que geram código para você. @property está apenas dizendo que haverá um método getter (e / ou setter) para esse nome de propriedade. Atualmente, @property é suficiente para ter métodos e uma variável de armazenamento criada para você pelo sistema (você costumava adicionar @sythesize ). Mas você tem que ter algo para acessar e armazenar a variável.


tudo o que você precisa fazer é largar um

@synthesize title;

na sua implementação e você deve estar tudo pronto. Funciona da mesma forma que apenas colocar a propriedade na sua interface de classe.

Editar:

Você pode querer fazer isso mais especificamente:

@synthesize title = _title;

Isto irá alinhar com a forma como a síntese automática do xcode cria propriedades e ivars se você usa auto-síntese, então se sua classe tiver propriedades de um protocolo e uma classe, alguns de seus ivars não terão o formato diferente que poderia impactar legibilidade.





cocoa-touch