Come qualcuno che è nuovo in Objective-C qualcuno può darmi una panoramica del mantenimento, assegnare, copiare e tutti gli altri che mi mancano, che seguono la direttiva @property? Cosa stanno facendo e perché dovrei usarne uno sopra l'altro?
Come qualcuno che è nuovo in Objective-C qualcuno può darmi una panoramica del mantenimento, assegnare, copiare e tutti gli altri che mi mancano, che seguono la direttiva @property? Cosa stanno facendo e perché dovrei usarne uno sopra l'altro?
Risposte:
L'articolo collegato da MrMage non funziona più. Quindi, ecco cosa ho imparato nel mio (molto) breve periodo di programmazione in Objective-C:
nonatomico vs. atomico: "atomico" è l'impostazione predefinita. Utilizzare sempre "non anatomico". Non so perché, ma il libro che ho letto diceva che "raramente c'è una ragione" per usare "atomico". (A proposito: il libro che ho letto è il libro "Programmazione iOS" del BNR.)
readwrite vs. readonly - "readwrite" è l'impostazione predefinita. Quando @synthesize, verranno creati sia un getter che un setter. Se si utilizza "sola lettura", non verrà creato alcun setter. Usalo per un valore che non vuoi mai cambiare dopo l'istanza dell'oggetto.
conserva vs. copia vs. assegna
atomic
è altrettanto male che avvisare nonatomic
. Nessuna delle due scelte è quella "corretta", quindi i progettisti del linguaggio hanno optato per la più sicura delle due soluzioni. In realtà nonatomic
è generalmente la scelta migliore in quanto omette blocchi di thread estremamente costosi. L'unico motivo da utilizzare atomic
è se la tua proprietà potrebbe essere impostata da più thread (nel qual caso ometterla può portare a un rilascio eccessivo o una perdita).
Prima di conoscere gli attributi di @property, dovresti sapere a che serve @property.
@property offre un modo per definire le informazioni che una classe intende incapsulare. Se dichiari un oggetto / variabile usando @property , quell'oggetto / variabile sarà accessibile ad altre classi importando la sua classe.
Se si dichiara un oggetto utilizzando @property nel file di intestazione, è necessario sintetizzarlo utilizzando @synthesize nel file di implementazione. Questo rende l'oggetto conforme a KVC . Per impostazione predefinita, il compilatore sintetizza i metodi di accesso per questo oggetto.
i metodi di accesso sono: setter e getter.
Esempio: .h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
Ora il compilatore sintetizzerà i metodi accessor per nome .
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
Elenco di attributi di @property
atomico, non anatomico, conserva, copia, sola lettura, lettura / scrittura, assegnazione, forte, getter = metodo, setter = metodo, non sicuro_unretained
atomic è il comportamento predefinito. Se un oggetto viene dichiarato atomico, diventa thread-safe. Thread-safe significa che alla volta solo un thread di una particolare istanza di quella classe può avere il controllo su quell'oggetto.
Se il thread sta eseguendo il metodo getter, l'altro thread non può eseguire il metodo setter su quell'oggetto. È lento.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
Per questo motivo, è più veloce accedere a una proprietà non anatomica rispetto a una atomica.
@property (nonatomic)NSString *name;
Il metodo setter aumenterà il conteggio degli oggetti, in modo che occupi memoria nel pool di autorelease.
@property (retain)NSString *name;
Anche se viene impostata e successivamente modificata una stringa mutabile, l'istanza acquisisce qualsiasi valore abbia al momento dell'impostazione. Non saranno sintetizzati metodi setter e getter.
@property (copy) NSString *name;
adesso,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
il nome rimarrà inalterato.
Il compilatore genererà un getter, ma non un setter.
@property (readonly) NSString *name;
È l'opposto di sola lettura.
@property (readwrite) NSString *name;
Ricorda che conservare e assegnare sono sostanzialmente intercambiabili quando è abilitata la raccolta dei rifiuti.
@property (assign) NSInteger year;
Viene fornito con ARC.
@property (nonatomic, strong) AVPlayer *player;
Nel caso delle proprietà booleane (proprietà che hanno un valore SÌ o NO), è consuetudine che il metodo getter inizi con la parola "is"
@property (getter=isFinished) BOOL finished;
Il metodo dovrebbe terminare con due punti.
@property(setter = boolBool:) BOOL finished;
Un riferimento non sicuro è simile a un riferimento debole in quanto non mantiene in vita l'oggetto correlato, ma non sarà impostato su zero se l'oggetto di destinazione è deallocato.
@property (unsafe_unretained) NSObject *unsafeProperty;
Se è necessario specificare più attributi, includerli semplicemente come un elenco separato da virgole, in questo modo:
@property (readonly, getter=isFinished) BOOL finished;
@property
nel file di intestazione, è necessario sintetizzarlo utilizzando @synthesize
nel file di implementazione." Non sempre. Ad esempio, "Per impostazione predefinita, una readwrite
proprietà sarà supportata da una variabile di istanza, che verrà nuovamente sintetizzata automaticamente dal compilatore." Dal doc .
Dopo aver letto molti articoli ho deciso di mettere insieme tutte le informazioni sugli attributi:
- atomic // default
- nonatomic
- strong = keep // default
- debole = unsafe_unretained
- conservare
- assegnare // predefinito
- unsafe_unretained
- copia
- sola lettura
- readwrite // default
Di seguito è riportato un collegamento all'articolo dettagliato in cui è possibile trovare questi attributi.
Mille grazie a tutte le persone che danno le migliori risposte qui !!
Ecco la descrizione del campione dall'articolo
Esempio :
@property (retain) NSString *name;
@synthesize name;
Esempio:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Spiegare:
Supponiamo che esista una proprietà di stringa atomica chiamata "name" e se chiami [self setName: @ "A"] dal thread A, chiami [self setName: @ "B"] dal thread B e chiami [self name] da thread C, quindi tutte le operazioni su thread diversi verranno eseguite in serie, il che significa che se un thread esegue setter o getter, altri thread aspetteranno. Questo rende la proprietà "nome" di lettura / scrittura sicura ma se un altro thread D chiama [rilascio nome] contemporaneamente, questa operazione potrebbe causare un arresto anomalo perché qui non sono coinvolte chiamate setter / getter. Ciò significa che un oggetto è in lettura / scrittura sicuro (ATOMIC) ma non sicuro per i thread poiché un altro thread può inviare contemporaneamente qualsiasi tipo di messaggio all'oggetto. Lo sviluppatore dovrebbe garantire la sicurezza dei thread per tali oggetti.
Se la proprietà "name" non era anatomica, tutti i thread nell'esempio precedente - A, B, C e D eseguiranno simultaneamente producendo risultati imprevedibili. In caso di atomico, uno dei due A, B o C verrà eseguito per primo ma D può ancora essere eseguito in parallelo.
Esempio:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
Esempio :
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
Spiegazione forte e debole, grazie a BJ Homer :
Immagina che il nostro oggetto sia un cane e che il cane voglia scappare (essere deallocato). Puntatori forti sono come un guinzaglio per il cane. Finché hai il guinzaglio attaccato al cane, il cane non scapperà. Se cinque persone attaccano il loro guinzaglio a un cane (cinque forti puntatori a un oggetto), il cane non scapperà finché tutti e cinque i guinzagli non saranno staccati. Indicatori deboli, d'altra parte, sono come bambini piccoli che indicano il cane e dicono "Guarda! Un cane!" Finché il cane è ancora al guinzaglio, i bambini piccoli possono ancora vedere il cane e lo indicheranno comunque. Non appena tutti i guinzagli vengono staccati, tuttavia, il cane scappa, indipendentemente da quanti bambini lo indicano. Non appena l'ultimo puntatore forte (guinzaglio) non punta più a un oggetto, l'oggetto verrà deallocato e tutti i puntatori deboli verranno azzerati. Quando usiamo debole? L'unica volta che vorresti usare un debole, è se volevi evitare i cicli di mantenimento (ad es. Il genitore conserva il figlio e il bambino conserva il genitore, quindi nessuno dei due viene mai rilasciato).
Esempio:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Esempio:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretained è un qualificatore di proprietà che indica ad ARC come inserire le chiamate di conservazione / rilascio -unsafe_unretained è la versione ARC di assegnazione.
Esempio:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
Esempio:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
È possibile accedere alla proprietà atomica con un solo thread alla volta. È thread-safe . L'impostazione predefinita è atomica. Si prega di notare che non esiste una parola chiave atomica
Non anatomico significa che più thread possono accedere all'elemento. Non è sicuro
Quindi si dovrebbe essere molto attenti durante l'utilizzo di atomic. Come influisce sulle prestazioni del codice
preferisco questo link sulle proprietà in object-c in iOS ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html