2013-03-13 9 views
6

Qual è il modo corretto di lavorare con variabili di istanza (dichiarate sull'interfaccia), loro @property e @synthesize, quando si lavora nel progetto ARC? Quello che faccio è ora seguente:Modo corretto per utilizzare variabili di istanza/proprietà/sintetizzare con ARC

SomeClass.h:

@interface SomeClass : NSObject { 
    NSString *someString; 
} 
@property(nonatomic, copy) NSString* someString; 

e SomeClass.m:

@implementation SomeClass 

@synthesize someString; 

- (void)someMethod { 
    self.someString = @"Foobar"; 
} 

Il fatto è che ci sono altri approcci che funziona, come l'utilizzo di solo il @ proprietà:

SomeClass.h:

@interface SomeClass : NSObject 
@property(nonatomic, copy) NSString* someString; 

Accesso al someString senza self:

SomeClass.m:

@implementation SomeClass 

@synthesize someString; 

- (void)someMethod { 
    someString = @"Foobar"; 
} 

ecc Sono nuovo di Objective-C, io sono abituato a Java. Qual è il modo corretto di lavorare con gli attributi allora? Capisco che i casi speciali avranno un comportamento speciale, ma quale è l'approccio migliore in generale? (di solito voglio accedere alla variabile dalla classe stessa e da "outside" e voglio che ARC funzioni ancora correttamente, ad esempio non devo preoccuparmi delle perdite di memoria)

+2

Basta definire le proprietà. E se usi Xcode 4.5+, non hai nemmeno bisogno dell'istruzione sintetizzata. Questo è considerato come il modo corretto, poiché le proprietà creeranno automaticamente iVar. Se è necessario utilizzare un iVar, se in Xcode 4.5+, utilizzare "_" prima del nome della proprietà (poiché vengono creati automaticamente), in caso contrario, quindi crearli in questo modo: @synthesize variable = _variable; – Petar

+0

@ pe60t0 La necessità di non utilizzare più l'istruzione '@ synthesize' è stata effettivamente introdotta con Xcode 4.4. –

+0

Il mio male, non è possibile modificare il commento ora. – Petar

risposta

9

Per le proprietà semplici, non è necessaria la dichiarazione della variabile di istanza o @synthesize. Il compilatore clang genererà entrambi per te di default. Così si potrebbe scrivere questo nell'intestazione:

@interface SomeClass : NSObject 

@property (nonatomic, copy) NSString *someString; 

@end 

e l'implementazione:

@implementation SomeClass 

- (void)someMethod { 
    self.someString = @"Foobar"; 
} 

@end 

Evitare esempio l'accesso diretto variabile se non si è nel metodo -init o sovrascrivendo il setter. Dovunque dovresti usare la sintassi del punto (self.someString). Se è necessario accedere alla variabile di istanza, il sintetizzatore predefinito creerà un ivar con prefisso sottolineato, ad es. _someString.

Si noti che per le classi con le versioni mutevoli come NSString/NSMutableString e NSArray/NSMutableArray la pratica standard è quello di utilizzare una proprietà copy. Se si utilizza strong su una stringa o un array, il chiamante potrebbe passare in una versione mutabile e quindi mutare da sotto di te, causando bug difficili da trovare.

-2

Check out this SO post per informazioni su ARC.

(Modificato) L'attributo "strong" indica a ARC di conservare un oggetto finché l'oggetto con la proprietà non viene deallocato. È necessario l'attributo "copia" perché una proprietà NSString avrebbe potuto essere passata come NSMutableString. La "copia" garantisce che l'oggetto originale sarà tenuto in giro. Di nuovo, mi scuso per le informazioni errate/fuorvianti che avevo originariamente qui.

La ragione per cui si può accedere all'istanza variabilesomeString così come la proprietà self.someString è che la linea di @synthesize someString crea una variabile di istanza per la proprietà e crea i metodi per ottenere e impostare il valore di esso. Tuttavia, si consiglia di utilizzare la proprietà anziché utilizzare direttamente la variabile di istanza poiché, utilizzando la variabile di istanza, non è possibile consentire all'oggetto principale di sapere che è stata modificata una delle sue proprietà.

+0

Si noti che poiché Xcode 4.4 se non si utilizza esplicitamente '@ synthesize', la variabile di istanza verrà denominata implicitamente' _someString' con il carattere di sottolineatura principale. –

+1

L'uso di 'strong' con le stringhe è sbagliato. È prassi comune usare 'copia' su cose come' NSString' o 'NSArray' dove il chiamante potrebbe passare nella sottoclasse mutabile (' NSMutableString' o 'NSMutableArray') e poi mutarlo in un secondo momento. –

Problemi correlati