iphone - Differenza tra @property e ivar in Xcode 4.5




ios properties (2)

In precedenza ho sempre visto esempi di utilizzo di proprietà e iVars come questo ...

All'interno di SomeClass.h

@interface SomeClass : NSObject {
    NSString *_someString;
}

@property NSString *someString;

@end

Quindi in SomeClass.m

#import "SomeClass.h"

@implementation SomeClass

@synthesize someString = _someString;

@end

Più di recente (nei video del WWDC 2012) ho sentito che non abbiamo più bisogno di @synthesize e si consiglia di utilizzare semplicemente @property senza iVar associato.

Quindi quanto sopra cambierebbe in ...

SomeClass.h

@interface SomeClass : NSObject

@property NSString *someString;

@end

SomeClass.m

#import "SomeClass.h"

@implementation SomeClass

@end

Questo è solo usando @property e no ivar. Questo ha senso e io l'ho usato.

Tuttavia, ho visto anche esempi di ...

SomeClass.h

@interface SomeClass : NSObject

@end

SomeClass.m

#import "SomeClass.h"

@interface SomeClass () {
    NSString *someString;
}

@end

@implementation SomeClass

@end

In questo hanno solo un privato iVar e no @property .

Quindi qual è la differenza? Comprendo che @property fornisce anche i metodi di accesso, ma non è necessario sovrascrivere i metodi di accesso. Puoi semplicemente usare i metodi di accesso predefiniti.

Quindi quando useresti @property e non un ivar e quando useresti solo un ivar e non un @property ? E perché non ti libereresti completamente di ivars e userai solo @properties ? Se hanno bisogno di essere privati, basta usarli all'interno dell'estensione dell'interfaccia nel .m .

Modifica rapida in risposta a una risposta sulla gestione della memoria. Sto usando ARC e per me sembrerebbe che io abbia più controllo sulla gestione della memoria con l'utilizzo di @properties strong e weak di me con l'utilizzo di iVars.

Spero che la domanda sia abbastanza chiara.

Grazie


In generale puoi sempre usare le proprietà. Se hai la proprietà "assign" puoi usare ivar beause non hai bisogno di alcuna gestione della memoria nei tuoi getter / setter. Ma se dovessi conservare oggetti, è solo sconsigliabile usare ivars perché devi mantenerli / rilasciarli manualmente mentre le proprietà fanno ciò per te.

Inoltre se usi ivars non hai il controllo sull'impostazione / acquisizione dei valori. In generale è un cattivo uso di usare campi pubblici invece di getter o setter. Ad esempio non è ok se si può impostare un valore negativo per il campo che memorizza l'età della persona.

E non puoi usare KVO con ivars


Penso che dipenda dal fatto che tu abbia accesso a ivars pubblici con la sintassi " -> ". Forse in precedenza, se dichiari una proprietà @private senza @private ivar, puoi accedere ad esso ivar con la sintassi " -> ". (forse il suo incapsulamento delle pause).

Ma ora se dichiari qualcosa come questo

{
@private NSArray *a;
@protected NSArray *b;
@public NSArray *c;
}
@property (nonatomic, retain) NSArray *d; 

Puoi accedere con " -> " solo a " c " ivar, basta provare questo codice. con a, be d sarà avvertimento o errore.

Se in qualche modo aiuta, sarò felice.





ivars