Impostazione delle proprietà in esecuzione in Objective-C
-
25-09-2019 - |
Domanda
Una delle cose con cui ho avuto difficoltà, mentre mi sono imbattuto nella programmazione oggettiva-C, è capire come manipolare le proprietà. Forse sono fuori dalla mia zona di comfort usando un linguaggio di codifica adeguato rispetto ai linguaggi di scripting a cui sono abituato, quindi le cose di dichiarazione nei file di intestazione e nei file di implementazione mi stanno confondendo in qualche modo.
Diciamo che ho una stringa. Desidero aggiungere un po 'di testo a quella stringa. Cosa devo dichiarare nel file di intestazione e cosa devo fare nel file di implementazione per consentire a questo di funzionare correttamente e cosa sono @property e @synthesize?
Soluzione
Nei vecchi tempi prima di Objective-C 2.0, era comune scrivere getter e setter per le tue variabili di istanza, ad es.
@interface Foo : NSObject
{
@private
id foo;
}
-(void) setFoo: (id) newFoo;
-(id) foo;
@end
@implementation Foo
// need dealloc to release foo too.
-(void) setFoo: (id) newFoo
{
[newFoo retain];
[foo release];
foo = newFoo;
}
-(id) foo
{
return foo;
}
@end
E questo è solo nell'ambiente filettato. C'erano ancora più cose necessarie per le app multithread.
Le proprietà forniscono una scorciatoia ordinata per quanto sopra. @Property sostituisce entrambe le dichiarazioni nell'interfaccia, oltre a dare al chiamante suggerimenti migliori sulla semantica di Getter e Setter. Ti consente inoltre di @syntesizzare gli accessori in modo che il compilatore genererà il codice per loro automaticamente (non lo fai avere Per @syntesizerli, puoi fornire le tue implementazioni se lo desideri). Tutto quanto sopra può essere sostituito da
@interface Foo : NSObject
{
@private
id foo;
}
@property (nonatomic, retain) id foo;
@end
@implementation Foo
// need dealloc to release foo too.
@synthesize foo;
@end
Ciò consente di risparmiare un sacco di digitazione, ma puoi anche vedere dall'interfaccia che setfoo: manterrà il suo nuovo valore e che la proprietà non è sicura da utilizzare (da utilizzare o Ottieni) in un ambiente multithread (senza altri meccanismi di bloccaggio).
Altri suggerimenti
@property
- Dichiara una proprietà con modificatori di accesso e memoria. Le proprietà possono essere leggi o leggi, non atomiche o atomiche (sicurezza del thread), assegna/trattenere/copia gestite. In realtà, puoi dichiarare semplici metodi di getter e setter come abbiamo fatto nell'era tigre, ma dichiarando a @property
Ti aiuterà a identificare tutti gli aspetti della proprietà in qualsiasi momento senza controllare l'implementazione.
@sintetizzare - Semplifica il lavoro se hai bisogno di una proprietà semplice senza alcun lavoro complesso in getter e setter. Definisce un'implementazione predefinita in base alla definizione di @property
.
Finalmente, le tue domande sulla stringa. Le proprietà non ti aiuteranno qui se stai cercando qualcosa di semplice, diciamo myObj.string += "abc"
. Non è uno stile Objective-C e con o senza proprietà farai qualcosa di simile myObj.string = [[myObj string] stringByAppendingString:@"abc"]
o [[myObj string] appendString:@"abc"]
a seconda della natura mutabile/immutabile dell'oggetto stringa.
Come linea di fondo: è un argomento piuttosto importante per spiegare tutto in un singolo post. Ti consiglio di leggere la documentazione di Apple e forse acquistare un libro su Objective-C. Aaron Hillegass ha scritto uno - un buon inizio per qualsiasi principiante Objective -C e Mac OS X.