Alvorens in te gaan over de attributen van @property, moet u weten wat is het nut van @property. @property biedt een manier om de informatie die een klasse is bedoeld om in te kapselen definiëren. Als u een object / variabele declareert met behulp @property, dan zal dat object / variabele toegankelijk zijn voor andere klassen importeren van zijn klasse. Als u een object te verklaren met behulp van @property in de header-bestand, dan moet je om het te synthetiseren met behulp van @ synthetiseren in de uitvoering bestand.
Voorbeeld:
.h klasse
@interface ExampleClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m klasse
@implementation ExampleClass
@synthesize name;
@end
Nu is de compiler zal synthetiseren accessormethoden voor de naam.
ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];
Lijst van attributen van @property: atoom. nonatomic. behouden. kopiëren. alleen lezen. lezen schrijven. toewijzen. sterk.
atomaire: Het is het standaard gedrag. Als een object zoals atomaire gedeclareerd dan wordt het thread-safe. Thread-veilige middelen tegelijk slechts één draad van een bepaalde instantie van die klasse kan de controle over deze strekken.
voorbeeld:
@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic
nonatomic: Het is niet thread-safe. U kunt de nonatomic eigenschapkenmerk gebruiken om aan te geven dat gesynthetiseerd accessors eenvoudig instellen of direct terug te keren een waarde, zonder garanties over wat er gebeurt als dat dezelfde waarde gelijktijdig is toegankelijk vanuit verschillende draden. Om deze reden, het is sneller toegang tot een nonatomic pand dan een atomaire één.
@property (nonatomic)NSString *name;
behouden: nodig als het attribuut een pointer naar een object.The setter methode zal toenemen behouden telling van het voorwerp, zodat het geheugen AutoRelease pool inneemt.
@property (retain)NSString *name;
exemplaar: Als u een kopie gebruikt, kunt u geen gebruik te behouden. Met behulp van een kopie instantie van de klasse zal zijn eigen exemplaar bevatten. Zelfs als een veranderlijk string vastgesteld en vervolgens veranderd, de instantie vangt wat waarde die het heeft op het moment dat deze is ingesteld. Geen setter en getter methoden worden gesynthetiseerd.
@property (copy) NSString *name;
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
alleen-lezen: Als u niet wilt dat het pand moet worden gewijzigd via setter methode, kunt u alleen-lezen verklaren het pand.
@property (readonly) NSString *name;
readwrite: is het standaard gedrag. Je hoeft niet te readwrite attribuut expliciet.
@property (readwrite) NSString *name;
wijzen: een zetter waarbij de waarde voor de instantievariabele rechtstreeks toegewezen, in plaats van kopiëren of behouden te genereren. Dit is het beste voor primitieve types zoals NSInteger en CGFloat, of objecten die je niet direct bezit, zoals afgevaardigden.
@property (assign) NSInteger year;
strong: is een vervanging voor te behouden.
@property (nonatomic, strong) AVPlayer *player;
unsafe_unretained: Er zijn een paar klassen in Cocoa en Cocoa Touch, dat nog niet ondersteunen zwak referenties, wat betekent dat je een zwakke eigenschap of zwakke lokale variabele niet te kennen te houden van hen. Deze klassen omvatten NSTextView, NSFont en NSColorSpace, etc. Als u een zwakke verwijzing te gebruiken om een van deze klassen, moet u een onveilige referentie gebruiken. Een onveilige verwijzing vergelijkbaar met een zwakke verwijzing doordat het zijn verwant doel levend bijhoudt, maar het zal niet worden ingesteld op nul indien het doelobject wordt deallocated.
@property (unsafe_unretained) NSObject *unsafeProperty;