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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top