Em sua interface, você pode declarar formalmente uma variável de instância entre as chaves, ou por meio de @propertyfora das chaves, ou ambos. De qualquer forma, eles se tornam atributos da classe. A diferença é que, se você declarar @property, poderá implementar o using @synthesize, que codifica automaticamente seu getter / setter para você. O setter autocodificador inicializa inteiros e flutua para zero, por exemplo. SE você declarar uma variável de instância e NÃO especificar uma correspondente @property, não poderá usar @synthesizee deverá escrever seu próprio getter / setter.
Você sempre pode substituir o getter / setter codificado automaticamente especificando o seu próprio. Isso geralmente é feito com a managedObjectContextpropriedade que é carregada lentamente. Assim, você declara seu managedObjectContextcomo uma propriedade, mas também escreve um-(NSManagedObjectContext *)managedObjectContext método. Lembre-se de que um método, que tem o mesmo nome de uma variável / propriedade de instância, é o método "getter".
O @propertymétodo de declaração também permite outras opções, como retaine readonly, que o método de declaração de variável de instância não permite. Basicamente, ivaré a maneira antiga, e @propertyestende-a e torna-a mais sofisticada / fácil. Você pode se referir a qualquer um deles usando o self. prefixo, ou não, não importa, desde que o nome seja único para aquela classe. Caso contrário, se sua superclasse tiver o mesmo nome de uma propriedade que você, você terá que dizer self.name ou super.name para especificar de qual nome está falando.
Assim, você verá cada vez menos pessoas declarando ivars entre colchetes e, em vez disso, passar a apenas especificar @propertye depois fazer @synthesize. Você não pode fazer @synthesizeem sua implementação sem um correspondente @property. O Sintetizador só sabe que tipo de atributo é a partir da @propertyespecificação. A instrução de síntese também permite renomear propriedades, para que você possa se referir a uma propriedade por um nome (abreviação) dentro do seu código, mas fora do arquivo .h use o nome completo. No entanto, com o autocomplete muito legal que o XCode tem agora, isso é menos uma vantagem, mas ainda está lá.
Espero que isso ajude a esclarecer toda a confusão e desinformação que está circulando por aí.