Eu vi o seguinte pedaço de código:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
Qual é a relação entre mapView
e mapView1
? Ele cria um método set
e get
para mapView1
?
iphone
objective-c
Hoang Duy Nam
fonte
fonte
Respostas:
No seu exemplo,
mapView1
é uma variável de instância (ivar), uma parte do armazenamento de memória que pertence a uma instância da classe definida emexample.h
eexample.m
.mapView
é o nome de uma propriedade . Propriedades são atributos de um objeto que pode ser ler ou definir usando a notação de ponto:myObject.mapView
. Uma propriedade não precisa ser baseada em um ivar, mas a maioria das propriedades é. A@property
declaração simplesmente diz ao mundo que existe uma propriedade chamadamapView
.@synthesize mapView = mapView1;
Essa linha diz ao compilador para criar um setter e um getter para
mapView
, e que eles devem usar o ivar chamadomapView1
. Sem a= mapView1
parte, o compilador assumiria que a propriedade e ivar têm o mesmo nome. (Nesse caso, isso produziria um erro do compilador, pois não há ivar chamadomapView
.)O resultado desta
@synthesize
declaração é semelhante a se você tivesse adicionado esse código:Se você mesmo adicionar esse código à classe, poderá substituir a
@synthesize
instrução por@dynamic mapView;
O principal é ter uma distinção conceitual muito clara entre ivars e propriedades. Eles são realmente dois conceitos muito diferentes.
fonte
@synthesize
cria um getter e um setter para a variávelIsso permite que você especifique alguns atributos para suas variáveis e, quando
@synthesize
essa propriedade for gerada, o getter e o setter para a variável.O nome da propriedade pode ser o mesmo que o nome da variável. Às vezes, as pessoas querem que ele seja diferente, de modo a usá-lo em
init
oudealloc
ou quando o parâmetro é passado com o nome da mesma variável.fonte
A partir da documentação :
fonte
Como acabei de me deparar com esse problema ao editar o código legado, quero fazer anotações adicionais às respostas existentes de que precisamos estar cientes.
Mesmo com uma versão mais recente do compilador, às vezes faz diferença se você omitir
@synthesize propertyName
ou não .No caso, você declara uma variável de instância sem sublinhado enquanto ainda a sintetiza, como:
Cabeçalho:
Implementação:
self.someInt
acessará a mesma variável quesomeInt
. Não usar um sublinhado principal para ivars não segue as convenções de nomenclatura, mas acabei de entrar em uma situação em que precisava ler e modificar esse código.Mas se agora você pensa "Ei, @synthesize não é mais importante porque usamos um compilador mais novo", você está errado! Sua classe resultará em dois ivars ,
someInt
mais uma_someInt
variável gerada automaticamente . Portanto,self.someInt
esomeInt
não abordará mais as mesmas variáveis. Se você não espera um comportamento como o meu, isso pode causar dor de cabeça para você descobrir.fonte
@synchronize
é uma diretiva sobre como sincronizar threads ao acessar a propriedade e@synthesize
é para vincular a propriedade a uma variável de instância por meio de getters e setters.Autosynthesized property 'someInt' will use synthesized instance variable '_someInt', not existing instance variable 'someInt'
. (Eu não sei em qual versão do Xcode foi adicionado este aviso.)De acordo com a documentação da Apple, o @Synthesize é usado apenas para renomear variáveis de instância. Por exemplo
Agora na classe você não pode usar,
_str
pois a linha acima renomeia a variável de instância parastr2
@property
permite que objetos sejam usados por objetos em outras classes ou, por outras palavras, torna o objeto público.fonte
Quando você cria uma propriedade em @interface, essa propriedade será automaticamente retornada por uma variável de instância denominada _propertyName. Portanto, quando você cria uma propriedade nomeada como firstName, o compilador por trás da cena cria uma variável de instância denominada _firstName por padrão. O compilador também criará o método getter e setter para você (por exemplo, firstName, setFirstName).
Agora, quando você sintetiza a propriedade por @synthesize firstName, está simplesmente dizendo ao compilador que renomeie minha variável de instância (_firstName) por firstName. Se você deseja renomear sua variável de instância de backup por nome diferente, basta atribuir um nome diferente enquanto sintetiza o nome da propriedade (por exemplo, @synthesize firstName = myFirstName), fazendo isso sua propriedade é copiada por uma variável de instância denominada myFirstname.
Portanto, em suma, na maioria das vezes @synthesize costumava renomear sua variável de instância com backup de sua propriedade.
fonte
Veja os documentos da apple
Basicamente, o synthesize cria os métodos setMapView e mapView que definem e obtêm mapView1
fonte
Cria getter e setter para o seu objeto. Você pode acessar com algo assim:
ou
mapView1 é o nome do ivar na classe, mapView é o nome do (s) método (s) getter / setter.
fonte