Eu gostaria de mostrar e discutir alguns exemplos sobre como adicionar e manipular as propriedades em Objective-C classe. : Um exemplo clássico, precisamente, é a seguinte: na definição da nossa classe de interface que definimos duas propriedades nome e cognome :
1 2 3 4 5 6 7 8 9 10 11 |
e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: No arquivo de implementação, nós inserimos a declaração @synthesize de modo que Xcode irá produzir para nós a métodos getter e setter , respectivamente, usados para ler e definir nossas duas propriedades:
1 2 3 4 5 6 7 8 | / / MyClass.m # Importar "MyClass.h" @ Implementação MyClass @ Name sintetizar, sobrenome; @ End |
, possiamo scrive: Quando você estiver indo para usar a nossa classe MyClass , que é quando istanziaremo um objeto do tipo MyClass , podemos escrever:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | / / Qualquer outra classe, como AppDelegate / / No arquivo. H # Importar <UIKit/UIKit.h> # Importar "MyClass.h" @ Classe TestViewController; NSObject <UIApplicationDelegate> { @ TesAppDelegate Interface: NSObject {<UIApplicationDelegate> UIWindow janela *; * TestViewController viewController; MyClass * myClass; } / / No arquivo. M MyClass alloc ] ; myClass = [MyClass alloc]; "Giovambattista" ; miaClasse.nome @ = "Giovambattista"; "miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "% @ = miaClasse.nome" miaClasse.nome); |
Ou, o que é equivalente a:
1 2 3 | / / Sempre no arquivo. M @ "Undolog" ] ; [SetNome myClass: @ "Undolog"]; "miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @" [myClass nome]); |
So far so good. No entanto, ele poderia enganar a equivalência de "variabli" interno (ivar) como propriedade real. Para compreender a diferença, propor novamente o mesmo que fazer sem, desta vez, a @synthesize . . Agora, portanto, devemos tratar-nos a escrever a métodos getter e setter . Para enfatizar ainda mais as diferenças, as variáveis internas rinominerò inserir um sublinhado antes do nome. Mas nós vemos o código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Importar <Foundation/Foundation.h> NSObject { @ Interface MyClass: NSObject { _nome; NSString * _name; _cognome; NSString * _cognome; } NSString * ) nome; // get - ( NSString *) nome; / / pega NSString * ) cognome; // get - ( NSString *) nome; / / pega void ) setNome : ( NSString * ) stringaIngresso; // set - (Void) setNome: ( NSString *) stringaIngresso; / set / void ) setCognome : ( NSString * ) stringaIngresso; // set - (Void) setCognome: ( NSString *) stringaIngresso; / set / @ End |
. Ao contrário do exemplo anterior, os apontadores para as variáveis internas (incapsultate) tornaram-se _nome e _cognome . . @property è scomparso, in quanto non serve più. Além disso, existem quatro definições de métodos que representam o nosso get e set . @property desapareceu, como não precisava mais.
Vemos o arquivo de implementação MyClass.m :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # Importar "MyClass.h" @ Implementação MyClass / / Pega um "nome" NSString * ) nome { - ( NSString *) nome { _name Retorno; } / / Definido como "nome" void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso _name = StringaIngresso; } / / Pega para "sobrenome" NSString * ) cognome { - ( NSString *) nome { _cognome retornar; } / / Definido como "Last Name" void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
Uma classe de modo escrita pode ser utilizado exactamente como o anterior, a saber:
1 2 3 4 5 6 7 8 | MyClass alloc ] ; myClass = [MyClass alloc]; "Giovambattista" ; miaClasse.nome @ = "Giovambattista"; "miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "% @ = miaClasse.nome" miaClasse.nome); / / Ou, o que é equivalente a: @ "Undolog" ] ; [SetNome myClass: @ "Undolog"]; "miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @" [myClass nome]); |
e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . No nível de negligência educacional @synthesize nos obrigou a escrever "os seus próprios métodos de get e set , com destaque - mesmo com a adição dell'underscore - as diferenças entre o nome da propriedade e sua ivar interna _nome .
permette un reale controllo del dato prima della sua impostazione (o prima della sua lettura) e quindi un reale incapsulamento per proteggere la variabile interna. A nível funcional do uso pessoal dos métodos de get e set permite o controle real dos dados antes da sua definição (ou antes de sua leitura) e, em seguida, um encapsulamento real para proteger a variável interna.
Por exemplo, seria possível impedir a passagem de cadeias vazias para a propriedade de nome :
1 2 3 4 |
Outra variante
Se você quiser usar as variáveis internas com o sublinhado na frente (que rpoviene Adobe ActionScript pode ser usado como bem) não é necessário abandonar o uso da diretiva @synthesize . Xcode torna possível "mesclar" os métodos acima:
1 2 | _nome; Sintetizar @ name = _name; _cognome; Sintetizar @ name = _cognome; |
. Ao fazê-lo nós poderíamos usar internamente ponteiro _nome ", resumiu" - para o exterior - como uma propriedade de nome . e setter , è vero anche che lo fa solo se non li trova, quindi se desiderate “implementare” un vostro metodo di getter e/o setter potete farlo anche se avete usato la direttiva @synthesize . Além disso, embora o uso de @synthesize produz métodos de geração (mensagens) de getter e setter , também é verdade que ele faz isso somente se ele encontra-los, por isso, se você quer "implementar" um método para o seu getter e / ou setter pode fazer isso mesmo se você usou a directiva @synthesize .
As alocações de memória
Nos exemplos acima eu ter omitido alguns detalhes importantes para uma implementação real. Primeiro de tudo, eu ainda não mostrei qualquer método init() , útil para a inicialização do objeto e valores padrão. Além disso, falta-lhe a adição de um método dealloc() :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | / Arquivo / MyClass.m # Importar "MyClass.h" @ Implementação MyClass id ) init { - (Id) {INIT self = [ super init ] ) { if (self = [super init]) { "Nome preimpostato" ; _name @ = "Nome da predefinição"; "Cognome preimpostato" ; _cognome @ = "Nome da predefinição"; } retornar auto; } void ) dealloc { - (Void) {dealloc ; [_name Lançamento]; ; [_cognome Lançamento]; ; [Super dealloc]; } NSString * ) nome { - ( NSString *) nome { _name Retorno; } void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso @ = "sem nome"; _name = StringaIngresso; } NSString * ) cognome { - ( NSString *) nome { _cognome retornar; } void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
, etc… No futuro, vamos então ver os detalhes sobre as propriedades readonly , retain , etc ... ![]()








Últimos Comentários
Rosanna : Alguém pode me dizer como faço para excluir o Snap Shots janela que se abre automaticamente quando eu ...
bendito Maresca : Eu não posso fazer download de qualquer skypemote me spiegaaa
Mateus : Olá a todos, infelizmente o Google não permite o uso da API para o Flash, mas vai ...
Giovambattista Fazioli : @ GM: Se você fazer upload de imagens para um servidor diferente (que o WordPress não pode ...
GM : Oi, desculpe ressuscitar um post antigo, mas eu espero que você possa me dar uma mão. Como eu, com este método, ...