2012-05-21 25 views
12

Devo creare una variabile di istanza di tipo BOOL con un valore predefinito di False in una delle mie classi Objective-C. Come faccio a fare questo? Ho visto persone che lo definiscono nel loro file .h ma non ho davvero bisogno che questa variabile sia pubblica. Quindi non dovrei inserirlo nel mio file .m? Inoltre, dovrei renderlo un immobile? O non dovrei mai fare qualcosa di una proprietà? Grazie.Come si crea una variabile di istanza BOOL nell'obiettivo c?

+0

Prova: '- (void) {viewDidLoad BOOL bandiera = NO; } '. Inoltre, una volta che si desidera dichiarare nel file .m non è possibile sintetizzarlo da un file .m. –

+0

Dove dovrei definire 'flag'? Non ha senso nel file .m? Tuttavia, non riesco a capire la sintassi per questo. Thx – Nosrettap

+0

definisce la proprietà nella classe .m come fai in .h .. renderà il bool privato alla classe non accessibile dall'esterno. – iphonic

risposta

21

Ho bisogno di creare una variabile di istanza di tipo BOOL con un valore predefinito di FALSE in una delle mie classi di obiettivo c. Come faccio a fare questo?

Supponendo che si sta utilizzando il Xcode corrente, è possibile dichiarare l'Ivar nell'attuazione come questo:

@implementation MyClass 
{ 
@private 
    BOOL myBool; 
} 

Ho visto persone definiscono nel loro file .h ma io don' Ho davvero bisogno che questa variabile sia pubblica.

Storicamente, è necessario dichiarare variabili di istanza nello @interface a causa del modo in cui sono state implementate le classi. Questo è ora necessario solo se si sta utilizzando OS X a 32 bit.

Inoltre, dovrei renderlo un immobile?

Dipende. Dovresti sicuramente renderlo una proprietà se fa parte dell'API esterna della tua classe (per classi o sottoclassi non correlate da utilizzare. Se è solo una parte dello stato interno dell'oggetto, non è necessario renderlo una proprietà (e io non lo faccio) t).

O non dovrei mai fare qualcosa di un immobile? Grazie.

Se non si utilizza ARC e il tipo è un tipo di oggetto (BOOL non lo è) si dovrebbe sempre farlo una proprietà per sfruttare la gestione della memoria degli accessori sintetizzati.Se si è utilizzando ARC, il consiglio sull'elenco degli sviluppatori Apple è di creare cose che fanno parte delle proprietà API e cose che sono stato interno come ivar.

Si noti che, anche per stato interno, è possibile utilizzare KVO, nel qual caso, utilizzare una proprietà.

Se si dichiara questo BOOL come proprietà e lo si sintetizza, non è necessario dichiarare esplicitamente ivar. Se si vuole fare la proprietà "visibile" solo per la classe stessa, utilizzare un'estensione di classe

@interface MyClass() 

@property (assign) BOOL myBool; 

@end 

@implementation MyClass 

@synthesize myBool = myBool_; // creates an ivar myBool_ to back the property myBool. 

@end 

Si noti che, anche se il compilatore produrrà avvertenze per quanto sopra, in fase di esecuzione, ogni classe può inviare setMyBool: o myBool agli oggetti di MyClass.

0

Se si effettua una proprietà è pubblica. Se non vuoi che la variabile sia pubblica, allora non usare una proprietà. Perché non vuoi essere pubblico? Puoi avere proprietà readonly e renderlo scrivibile in .m tramite una categoria privata.

Si può mettere nel file .m se si utilizza iOS 5

@implementation MyClass { 
    BOOL _myBool; 
} 

Credo che questa sia una novità per iOS5. Ma ho visto un codice come questo:

@implementation MyClass { 
@private 
    BOOL _myBool; 
} 

Spero che questo aiuti.

+0

"Se si rende una proprietà è pubblica." In realtà, no. Le proprietà possono essere dichiarate privatamente in un'estensione di classe o in una categoria. – jlehr

+0

Ma se non fai nulla sono pubblici. – Pfitz

+0

Se non fai niente, non hai nulla. Ciò che determina se un metodo o una proprietà è pubblico è dove è dichiarato. Se è dichiarato nell'intestazione, è pubblicamente visibile; altrimenti non lo è. (Non ci sono tuttavia delle applicazioni runtime.) – jlehr

2

BOOL sono dichiarati come iVars con un semplice BOOL myBool e come proprietà con @property (nonatomic, assign) BOOL myBool. Prendi nota però, i valori BOOLean sono inizializzati su NO (zero). Se hai bisogno di un BOOL per essere accessibile da altre classi, o "globale" nel file m, usa un iVar o una proprietà, altrimenti semplicemente dichiarali come scope vars in un singolo metodo.

+0

BOOL ivars inizializzati su SÌ? Vuoi ripensare a questa affermazione? – jrturton

+0

Ci crederesti ... Correzione automatica? – CodaFi

11

Se si desidera creare una variabile privata, è possibile utilizzare la potenza delle categorie. Fare un classe MyClass per esempio e nel file .m effettuare le seguenti operazioni:

#import "MyClass.h" 

@interface MyClass() //This is an empty category on MyClass class 

@property (nonatomic, assign) BOOL myBool; 

@end 


@implementation MyClass 

@synthesize myBool = _myBool; 

-(void)myMethod { 
    self.myBool = YES; //this is using the property 
    _myBool = NO; //this is the instance variable, as @synthesize creates an instance variable for you 
    // both are private 
} 

@end 
1

si può mettere la dichiarazione nel file .m.

Se si crea una proprietà da esso, dipende da ciò che si desidera. Come proprietà, è possibile applicare in seguito setter/getter che includono controllo/protezioni/qualunque sia. Inoltre, è possibile applicare l'accesso valore-chiave.

Se non è necessario uno di questi, non c'è un reale bisogno di una proprietà (ma una buona tradizione: non si sa mai, come si evolverà il codice).

0

io uso 0, 1, invece YES, NO

#define YES 1 
#define NO 0 
Problemi correlati