Existe alguma razão para declarar ivars se você estiver usando propriedades exclusivamente em Objective-C?

Eu costumo usar propriedades exclusivamente em minhas classs, especialmente agora que você pode declarar propriedades em uma extensão de class graças ao moderno tempo de execução Objective-C 2.0 – eu uso esse recurso para criar propriedades “privadas”.

Minha pergunta é se há algum bom motivo para declarar ivars em uma interface de class. Eu prefiro que minhas interfaces voltadas para o público sejam o mínimo e o mais limpo possível, revelando apenas aspectos da minha class que sejam pertinentes.

Por exemplo, eu costumava fazer o seguinte:

MyClass.h :

 @interface MyClass : NSObject @property (nonatomic, copy) NSString * publicString; @property (nonatomic, copy, readonly) NSString * readOnlyString; @end 

MyClass.m :

 @interface MyClass () @property (nonatomic, copy, readwrite) NSString * readOnlyString; @property (nonatomic, copy) NSString * privateString; @end @implementation MyClass @synthesize publicString = publicString_; @synthesize readOnlyString = readOnlyString_; @synthesize privateString = privateString_; - (void)init { self = [super init]; if (self != nil) { self.publicString = @"Public String"; self.readOnlyString = @"Read-Only String"; self.privateString = @"Private String"; } return self; } - (void)dealloc { [publicString_ release]; [readOnlyString_ release]; [privateString_ release]; [super dealloc]; } @end 

Preferências de estilo de código à parte, há algum problema em evitar os ivars inteiramente assim?

Eu posso ter encontrado uma resposta que seja adequada o suficiente para eu explicitamente apoiar minhas propriedades com ivars. Não parece que o depurador irá listar quaisquer ivars sintetizados automaticamente, então não há como apenas se perfurar durante a debugging e verificar vários valores além de chamar manualmente os acessadores da propriedade, o que é entediante. A menos que eles mudem isso, isso provavelmente é motivo mais que suficiente para eu voltar a declarar os ivars explicitamente.

A questão principal, se incomoda você, é que, por Cocoa With Love , variables ​​de instâncias dinâmicas, como aquelas que você está usando, não são suportadas por tempos de execução além dos de 64bit Intel / PowerPC (fixados por comentário de Chuck abaixo) e ARM (para iOS).

Atualmente, não consigo encontrar um documento oficial da Apple sobre o problema; Observe que a restrição ao último OS X, v10.6, não é suficiente, uma vez que está disponível e é suportada nas máquinas Intel de 32 bits que a Apple enviou imediatamente após a mudança do PowerPC.

Pensamento extra tardio: sem saber sobre possíveis mudanças no Xcode 4, um bom motivo para declarar variables ​​de instância privadas no arquivo de header é marcá-las como IBOutlets e conectá-las graficamente. Isso é realmente relevante apenas para um tipo muito específico de class e variável de membro, reconhecidamente.

Eu tenho que concordar com LucasTizma sobre o problema de debugging.

Quando comecei a usar o XCode4, comecei a não declarar explicitamente os ivars e deixá-los ser criados para mim usando a syntax @synthesize aVar = _aVar . Ao tentar depurar o código, notei que não podia passar o cursor sobre a variável e ver seu valor.

Para mim, isso é inaceitável. Eu acho que está de volta a declará-los explicitamente.

Além da preocupação de Tommy, declarar um ivar é certamente uma boa prática, especialmente se seu código puder ser reutilizado ou se você puder voltar ao seu código em algum momento.