Le proprietà dichiarate richiedono una variabile di istanza corrispondente?

Le proprietà in Objective-C 2.0 richiedono una variabile di istanza corrispondente da dichiarare? Ad esempio, sono abituato a fare qualcosa del genere:

MyObject.h

@interface MyObject : NSObject { NSString *name; } @property (nonatomic, retain) NSString *name; @end 

MyObject.m

 @implementation @synthesize name; @end 

Tuttavia, cosa succede se ho fatto questo invece:

MyObject.h

 @interface MyObject : NSObject { } @property (nonatomic, retain) NSString *name; @end 

È ancora valido? Ed è in qualche modo diverso dal mio precedente esempio?

Se stai usando Modern Objective-C Runtime (che è iOS 3.xo superiore, o 64-bit Snow Leopard o superiore), non devi definire ivars per le tue proprietà in casi come questo.

Quando @synthesize la proprietà, l’ivar sarà in effetti sintetizzato anche per te. Questo aggira lo scenario “fragile-ivar”. Puoi leggere di più su Cocoa with Love

Nella tua interfaccia, puoi dichiarare formalmente una variabile di istanza tra le parentesi, o tramite @property al di fuori delle parentesi, o entrambe. In ogni caso, diventano attributi della class. La differenza è che se dichiari @property , puoi implementare usando @synthesize , che codifica automaticamente il tuo getter / setter per te. Il setter auto-coder inizializza interi e fluttua a zero, per esempio. Se si dichiara una variabile di istanza e NON si specifica una proprietà @property corrispondente, non è ansible utilizzare @synthesize e scrivere il proprio getter / setter.

È sempre ansible ignorare il getter / setter con codifica automatica specificandone il proprio. Questo è comunemente fatto con la proprietà managedObjectContext che è caricata pigramente. Pertanto, si dichiara managedObjectContext come una proprietà, ma si scrive anche un metodo -(NSManagedObjectContext *)managedObjectContext . Ricorda che un metodo, che ha lo stesso nome di una variabile / proprietà di istanza, è il metodo “getter”.

Il metodo di dichiarazione @property consente anche altre opzioni, come @property e @property , che il metodo di dichiarazione della variabile di istanza non consente. Fondamentalmente, ivar è il vecchio modo e @property estende e lo rende più elaborato / più semplice. Puoi fare riferimento a usando il sé. prefisso, o no, non importa fino a quando il nome è unico per quella class. Altrimenti, se la tua superclass ha lo stesso nome di una proprietà come te, allora devi dire come self.name o super.name per specificare quale nome stai parlando.

Quindi, vedrai sempre meno persone dichiarare ivar s tra le parentesi graffe, e invece passare a specificare @property e quindi fare @synthesize . Non puoi fare @synthesize nella tua implementazione senza una proprietà @property corrispondente. Il sintetizzatore conosce solo il tipo di attributo che proviene dalla specifica @property . L’istruzione synthesize consente inoltre di rinominare le proprietà, in modo da poter fare riferimento a una proprietà con un solo nome (stenografia) all’interno del codice, ma all’esterno del file .h utilizzare il nome completo. Tuttavia, con il completamento automatico davvero fantastico che XCode ora ha, questo è meno vantaggioso, ma è ancora lì.

Spero che questo aiuti a chiarire tutta la confusione e la disinformazione che circolano là fuori.

funziona in entrambi i modi ma se non li si annulla nelle parentesi graffe, non si vedranno i loro valori nel debugger in xcode.

Dalla documentazione:

In generale, il comportamento delle proprietà è identico sia nei runtime moderni che in quelli legacy (vedere “Versioni e piattaforms runtime” nella Guida alla programmazione runtime Objective-C). C’è una differenza fondamentale: il runtime moderno supporta la sintesi di variabili di istanza mentre il runtime precedente no.

Affinché @synthesize funzioni nel runtime legacy, è necessario fornire una variabile di istanza con lo stesso nome e tipo compatibile della proprietà o specificare un’altra variabile di istanza esistente nell’istruzione @synthesize. Con il runtime moderno, se non si fornisce una variabile di istanza, il compilatore ne aggiunge uno.

Se usi XCode 4.4 o versioni successive genererà per te codice di sintesi variabile di istanza.

Devi solo dichiarare proprietà come di seguito; genererà codice sintetizzatore e codice di dichiarazione delle variabili di istanza per te.

 @property (nonatomic, strong) NSString *name; 

genererà il codice sintetizzatore come

 @synthesize name = _name; 

e puoi accedere alla variabile di istanza usando _name è simile a dichiarare

 NSString* _name 

ma se dichiari la proprietà di sola lettura che piace

 @property (nonatomic, strong, readonly) NSString *name; 

genererà il codice

 @synthesize name; 

o

 @synthesize name = name; 

Quindi dovresti accedere al nome della variabile istantanea senza prefisso “_” in qualsiasi modo tu possa scrivere il tuo codice sintetizzatore, quindi il compilatore genererà il codice per te. tu puoi scrivere

 @synthesize name = _name; 

Il linguaggio di programmazione Objective-C: direttive sull’implementazione della proprietà

Esistono differenze nel comportamento della sintesi dell’accessorio che dipendono dal runtime (vedere anche “Differenza di runtime”):

  • Per i runtime legacy, le variabili di istanza devono essere già dichiarate nel blocco @interface della class corrente. Se esiste una variabile di istanza con lo stesso nome della proprietà, e se il suo tipo è compatibile con il tipo di proprietà, viene utilizzata, altrimenti viene visualizzato un errore del compilatore.

  • Per i moderni runtime (vedere “Versioni e piattaforms runtime” nella Guida alla programmazione runtime Objective-C), le variabili di istanza vengono sintetizzate secondo necessità. Se esiste già una variabile di istanza con lo stesso nome, viene utilizzata.