2012-02-06 11 views
20

Questa è una domanda in due parti nella speranza che io possa comprendere ulteriori informazioni sull'argomento.Chiarimento dichiarazione proprietà iOS

1) Mi sembra di avere due popolari opzioni per dichiarare una proprietà per un classe in objective c. Uno è quello di aggiungere la proprietà al corpo della classe dell'intestazione, ad es.

@interface MyClass : NSObject { 
    NSArray *myArray; 
} 

Oppure è possibile aggiungere un commento dopo il corpo @interface e prima della dichiarazione @endin questo modo.

@interface MyClass : NSObject { 
    // 
} 

@property (nonatomic, retain) NSArray *myArray; 

Qual è la differenza tra questi due "stili" e quando si sceglie uno sopra l'altro?

2) dopo lo @property si trovano opzioni come (nonatomic, retain). Per quali motivi e perché/quando si utilizzano diverse opzioni?

risposta

47

Qui sono gli unici modificatori di proprietà che Xcode riconosce:

  • nonatomic (non far rispettare la sicurezza dei thread sulla proprietà, soprattutto per l'uso quando un solo thread deve essere utilizzato in tutto un programma)
  • atomic (fa rispettare sicurezza filetto sulla proprietà, principalmente per uso quando più thread sono utilizzati in tutto un programma) (default)
  • retain/strong (conserva automaticamente/uscite valori sul set, rende valori sicuri non DEALLOCATE inaspettatamente) (default se ARC e tipo di oggetto)
  • readonly (non si può impostare la proprietà)
  • readwrite (possono essere entrambi insieme e ottenere proprietà) (default)
  • assign/unsafe_unretained (senza gestione della memoria deve essere effettuato con questa struttura, viene gestita manualmente dalla persona assegnando il valore) (predefinito se non ARC o tipo di oggetto)
  • copy (copia l'oggetto prima di esso, in casi in cui il valore impostato non deve essere modificato a causa di fattori esterni (stringhe, matrici, ecc.).
  • weak (azzera automaticamente il riferimento dovrebbe all'oggetto essere deallocato, e non mantiene il valore passato)
  • getter=method (imposta il selettore utilizzato per ottenere il valore di questa proprietà)
  • setter= method (impostare il selettore utilizzato per impostare il valore di questa proprietà)
+3

Questa unica risposta è la parte 2 della domanda. La risposta di Simon discute la parte 1. –

+0

@MarkAmery ovviamente - ho sentito che la prima parte era davvero di base, e altre risposte l'avevano trattata mentre stavo rispondendo. Non c'è bisogno di aggiungere informazioni duplicate qui. –

+1

# 2 è completamente errato. Le proprietà 'atomic' * non * assicurano la sicurezza del thread; piuttosto assicura l'atomicità. Se il thread A e il thread B stanno entrambi scrivendo, 'atomic' assicura che il risultato sia un valore intero, che significa sia l'uno che l'altro. Quale è indefinito. Scrivere codice thread-safe non è così semplice come usare le proprietà 'atomic'. Vedere la sezione "Sincronizzazione" della Guida alla programmazione del threading: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i -CH8-SW1 –

0

Il primo sarà una dichiarazione privata e non sarà accessibile da altre classi se non si definisce il secondo. Second è usato insieme a @synthesize in .m module, e setter/getter's sono creati per te dal compilatore. Puoi ancora definire il tuo getter o setter con questo. In questo caso tutti gli iVar definiti in @property sono accessibili da altre classi. Le operazioni di ripristino/rilascio vengono eseguite automaticamente. Si consiglia di leggere la documentazione Apple per ulteriori dettagli. controllare: What's the difference between the atomic and nonatomic attributes?

28

1) @property è un modo speciale per definire i metodi getter e setter, o come li chiamiamo accessori in Objective-C. Il tuo primo frammento dichiara solo un array per il quale devi dichiarare e scrivere autonomamente. Ad esempio setMyArray: e myArray.
L'uso di @property dichiarerà i tuoi accessors per te ed equivale a dichiarare setMyArray: e myArray tu stesso. È il modo preferito per dichiarare gli accessor da Objective-C 2.0. Nota che devi ancora dichiarare la proprietà (nel tuo caso myArray) tu stesso.

2) È necessario prima conoscere @synthesize. Ricorda che @property DICHIARA gli accessor per la tua proprietà, @synthesize li IMPLEMENTA. Quando usi @property nella tua @interface, probabilmente scrivi @synthesize in @implementation. L'uso di @synthesize equivale all'implementazione di setMyArray: e myArray.
Gli attributi (nonatomic, retain) indicano al compilatore, tra l'altro, come dovrebbe funzionare la gestione della memoria e quindi come verranno implementati i metodi. Nota che non vedi mai questi accessori, ma ti assicuriamo che sono lì e pronti per essere usati.

Per ulteriori informazioni su tale argomento, mi raccomando di leggere la Sezione 9 su Proprietà dal seguente Tutorial o acquistare uno Book che copra un'introduzione all'Obiettivo-C.

Inoltre si dovrebbe familiarizzare con almeno i seguenti attributi:

  • accesso
    • Scegliere readwrite (default) o readonly. Se è impostato readonly, SOLO i metodi getter saranno disponibili.
  • Setter Memory Management
    • assign (default), assegna semplicemente il nuovo valore. Probabilmente lo usi solo con tipi di dati primitivi.
    • retain, rilascia il vecchio valore e conserva il nuovo. Se si utilizza il garbage collector, retain equivale a assign. Perché? La versione manuale del vecchio valore verrà eseguita dal garbage collector.
    • copy copia il nuovo valore e rilascia il vecchio valore. Questo è spesso usato con le stringhe.
  • Filettatura
    • atomic (default) assicurerà che il metodo setter è atomico. Ciò significa che solo un thread può accedere al setter in una sola volta.
    • nonatomic, utilizzare questo quando non si lavora con i thread.

This post ti dà una buona introduzione alla gestione della memoria e assign, retain e copy.

+0

@Jackson posso gentilmente chiedere di accettare la mia risposta? Se non è accettabile per favore fammi sapere cosa posso fare per migliorare la mia risposta. Gradirei davvero la reputazione che guadagnerei, grazie! – Simon

+2

Hey bud, in tutta onestà penso che "Richard J. Ross III" abbia avuto una risposta più * concisa * per un non-lettore come me. Comunque ti ho messo come +1 perché ovviamente hai fatto * un sacco di impegno * nella tua risposta. Inoltre, vedo il * concetto di business * nel chiedere perché non ho accettato la tua risposta, ma credo che sia un * "put-off" * chiedere a qualcuno di accettare la tua risposta. Sono sicuro che tutti sono * diversi * rispetto a questo argomento. C'è comunque il mio doppio senso. – Jacksonkr

2

Le proprietà sono fondamentalmente i metodi di accesso. Definiscono l'ambito della variabile. Primo caso come indicato sopra, la variabile non è accessibile in altre classi mentre dichiarando una proprietà come nel secondo caso, la variabile è accessibile anche in altre classi. Inoltre, sono utili per la gestione della memoria.

+0

Una variabile di istanza può essere resa accessibile ad altre classi, dichiarandole '@ public'. – newacct

0

Le proprietà sono fondamentalmente i metodi di accesso. Definiscono l'ambito della variabile. per impostazione predefinita, l'accesso della variabile è protetto e le proprietà impostano il relativo identificatore da protetto a Pubblico