Arquivo Dezembro de 2009

Objective-C: expor as propriedades em uma classe

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
/ / MyClass.h
# Importar <Foundation/Foundation.h>

NSObject { @ Interface MyClass: NSObject {
nome; NSString * nome;
cognome; NSString * nome;
}

retain ) NSString * nome; @ Property (reter) NSString * nome;
retain ) NSString * cognome; @ Property (reter) NSString * nome;
@ End

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
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso @ = "sem nome";
_name = StringaIngresso;
}

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 ... :)

Leia mais ...

Browser ou navegador do celular?

O nosso site não é mais visto apenas a partir de terminais de computador. Com a disseminação da telefonia móvel, graças ao iPhone, da Apple, o acesso ao site ou blog está cada vez mais sendo realizada por uma variedade de dispositivos móveis. Torne-se um Web Developer para muitos necessitam de ser capaz de interceptar e identificar os diferentes "agentes", ou seja, os meios pelos quais um usuário está vendo (navegação) nossas páginas.

Leia mais ...

Personalizar um formulário graficamente

Fui convidado como personalizar uma forma gráfica, incluindo uma caixa de busca como o deste blog. A técnica utilizada, ou melhor que uso, é obviamente válida para qualquer tipo de forma de módulo. O que muda é apenas a complexidade do trabalho a ser feito, dependendo da complexidade do próprio formulário.

Leia mais ...

WordPress: ver os tópicos mais recentes em bbPress

Vimos como o kernel integrado WordPress bbPress , por exemplo, para usar alguma função ou compartilhar seu tema WordPress. Agora vamos ver o contraio, a saber, como exibir as informações na página inicial do bbPress fórum do WordPress. Para fazer isso existem alguns plugins (alguns trabalham e outros não). Aqui vamos ver como se escreve a - função simples que, no caso, pode ser melhorada e aperfeiçoada em todos os casos - na verdade.

Leia mais ...

Apple iPhone: Criar um botão personalizado de alternância

non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom ! Os estados UIControlStateSelected ou UIControlStateHighlighted não funcionam quando um UIButton modo é definido UIButtonTypeCustom ! Ou melhor, não funciona (porque reservado para outros tipos de botão), por exemplo, para criar um botão com dois estados: nota de alternância. Se nós criamos duas imagens (stato1.png e stato2.png) para o nosso botão, podemos proceder da seguinte forma:

1
2
3
/ / O arquivo de cabeçalho que nós criamos uma variável global para usaremo
/ / Mude o cheque foi
ToggleFlag BOOL;

Agora vamos criar o nosso botão:

1
2
3
4
5
6
7
8
9
/ / Criamos um botão e nós colocá-lo inicialmente no estado "stato1.png"
/ / Edit initWithFrame: (CGRect)} {100,100,50,50 com a posição e
/ / Tamanho da sua imagem tem
; toggleFlag = YES;
[ [ UIButton buttonWithType : UIButtonTypeCustom ] initWithFrame : ( CGRect ) { 100 , 100 , 50 , 50 } ] ; UIButton ToggleButton * = [[UIButton buttonWithType: UIButtonTypeCustom] initWithFrame: (CGRect) {100, 100, 50, 50}];
@ "" forState : UIControlStateNormal ] ; [ToggleButton setTitle: @ "" forState: UIControlStateNormal];
[ UIImage imageNamed : @ "stato1.png" ] forState : UIControlStateNormal ] ; [ToggleButton setBackgroundImage: [UIImage imageNamed: @ "stato1.png"] forState: UIControlStateNormal];
self action : @selector ( onToggle : ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget ToggleButton: acção de auto: @ selector (onToggle :) forControlEvents: UIControlEventTouchUpInside];
toggleButton ] ; [Self.view addSubview: ToggleButton];

Quando você clicar no botão irá enviar uma mensagem para ser gerido onToggle :

1
2
3
4
5
6
7
void ) onToggle : ( id ) sender { - (Void) onToggle: (id) sender {
/ / Recuperar ponteiro para UIButton
( UIButton * ) sender; UIButton buttonClicked * = (UIButton *) remetente;
/ / Executar o Toogle
toggleFlag = toggleFlag!;
[ UIImage imageNamed : ( toggleFlag ) ? @ "stato1.png" : @ "stato2.png" ] forState : UIControlStateNormal ] ; [ButtonClicked setBackgroundImage: [UIImage imageNamed: (toggleFlag) @ "Stato1.png" @ "stato2.png"] forState: UIControlStateNormal];
}

Leia mais ...

Muito curto trecho: streaming de arquivos de mp3 para o iPhone da Apple

Uma alternativa muito fácil de executar um fluxo de um arquivo mp3 no iPhone da Apple pode ser:

Leia mais ...


Pare SOPA