Artigos com a tag 'Lançamento'

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

Como remover NSLog () da origem XCode

<a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSLog">NSLog()</a> uma função muito útil durante os estágios iniciais de um projeto para testar e depurar um aplicativo para o Apple iPhone ou, mais geralmente, no ambiente XCode. Sendo apenas uma função, assim como o outro, sua presença será sentida mesmo quando liberar (release) executável nosso. potrebbero influire sulle performance della nostra applicazione, soprattutto se abbiamo inserito NSLog() all'interno di loop. Por isso, torna-se necessário remover, de alguma forma, todas as linhas de NSLog() do nosso código, porque não é necessário, seja porque as chamadas para NSLog() poderia afetar o desempenho da nossa aplicação, principalmente se colocarmos NSLog() para 'loop interno.

Imediatamente descartar a solução para o "olhar" e "cancel" porque um dia não poderia ser utilizado novamente. Excluímos também a solução do "olhar" e "Comentários", desconfortável para a razão mesma de antes. Felizmente um ambiente limpo, simples e estão usando as condicionais de compilador corretas. O que fazemos na prática, e diz ao compilador para excluir - se houver uma condição específica - quando compilar as nossas linhas de origem que contêm NSLog() .

As compilações de directivas e instruções do compilador condicional, são um poderoso e generalizado. Aqueles que vem do desenvolvimento da ANSI-C certamente sabem muito bem e vai utilizzte em muitas situações. A peculiaridade dessas "instruções" reside no fato de, acima mencionado, para ser visto pelo compilador e não executável. Esta característica torna útil em muitos casos e podem resolver os problemas de outra maneira muito irritante.

Vamos ver um exemplo de código que, como previsto, você pode "apagar" por compilar pedaços de código, no nosso caso NSLog() :

1
2
3
4
5
6
# Define ACTIVE_NSLOG 1
/ / Se a constante é definida ACTIVE_NSLOG preencher
/ Bloco / de código entre # ifdef e # endif
# Ifdef ACTIVE_NSLOG
" ... bla bla" ) ; NSLog (@ "... blah blah");
# Endif

). Declarações condicionais são parte do compilador da mesma família como #define , também, na verdade, são precedidos por um "quilo" ( # ). solo se ACTIVE_NSLOG è definito. No exemplo mostrado, nós definimos uma constante ACTIVE_NSLOG ; linhas subseqüentes do código diz ao compilador para "incluir" linha NSLog() somente se ACTIVE_NSLOG está definido. Se teve o cuidado, durante a escrita do nosso código, inserindo chamadas para NSLog() dentro do bloco #ifdef ... #endif per far sparire, alla prossima compilazione, tutti i nostri NSLog() . #ifdef ... #endif , basta apagar a definição da constante ACTIVE_NSLOG a desaparecer, a compilação seguinte, toda a nossa NSLog() .

A melhor e final

Vamos agora ver como definir o ambiente XCode para melhorar ainda mais o que fizemos aqui! Primeiro vamos escolher um nome constante que usamos em nossos projetos para excluir da compilação NSLog() . o quello che preferite. Você pode escolher o nome que quiser, de DEBUG para MIO_DEBUG ou o que você preferir. Abra o seu projeto, novo ou velho. Coloque tudo NSLog() dentro do bloco (ou blocos):

1
2
3
# Ifdef MIO_DEBUG
" ... bla bla" ) ; NSLog (@ "... blah blah");
# Endif

Selecione o arquivo principal do seu projeto, clique direito e escolha o Get Info.

getinfo

Isso abre uma janela com informações sobre o projeto:

userdefine

Selecione a guia Build, verifique se você está em configuração de depuração (esta é a jóia), vá até a seção definida pelo usuário e adicionar, por meio do botão no canto inferior esquerdo, um novo campo chamado OTHER_CFLAGS . Neste assegnamoli o valor -DMIO_DEBUG=1 . A sintaxe é -D{mia define}=1 .

Este procedimento tem duas vantagens:

  1. Não devemos colocar o código #define MIO_DEBUG 1 , mas fazê-lo através das informações do projeto. Então, quando vamos para preencher a versão de lançamento (aquele sem o NSLog() ) devemos nos lembrar de apagar a linha #define MIO_DEBUG 1
  2. A constante é definido em relação à configuração, no nosso caso de depuração. Em seguida, passando para a configuração de lançamento (release) estará ausente e as linhas constantes com NSLog() não serão compilados

Conclusões

O procedimento acima pode ser útil em alguns casos moltidutine outros, com NSLog() , não têm nada a ver. Declarações condicionais pode ajudar o compilador em uma ampla variedade de contextos. Eles são freqüentemente usados ​​por programadores para determinar o tipo de versão do sistema operacional, o alvo, a presença de processadores matemáticos, mantendo a mesma fonte "idêntico".

Para entender isso, como exemplo, podemos utilizzre nossa constante MIO_DEBUG também a intervir em outras áreas do código:

1
2
3
4
5
6
7
8
9
10
/ Debug / se ganhar o jogo
/ / Com uma pontuação de 100 em vez de 10000 :)
# Ifdef MIO_DEBUG
score == 100 ) if (score == 100)
# Else
score == 10000 ) if (score == 10000)
# Endif
{
; [HaiVinto auto];
}

Para terminar, aqui estão alguns exemplos e suas variantes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/ / Em geral, há um
# Se a expressão
/ / Se instrução semelhante à tradicional, portanto, com uma expressão plena

/ / Verificar se uma constante é definida
# Ifdef constante

/ / Ver se ele não é uma constante definida
# Ifndef constante

/ / Else
# Else

/ Fecho / do bloco
# Endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/ / Por exemplo ...
# Define DEBUG 1
# Define MIA_ALTRA_COSTANTE 5

...
# Se DEBUG
/ / Preencha este
# Else
/ / Caso contrário, preencha este outro
# Endif

# Se MIA_ALTRA_COSTANTE> 4
"..." ) ; NSLog (@ "...");
# Endif
1
2
3
4
# Ifndef INCLUDE_MIO_FILE
# Define INCLUDE_MIO_FILE
# Include "mio_file.h"
# Endif

Leia mais ...


Pare SOPA