2010-07-03 15 views

Antwort

13

Objective-C Runtime Programming Guide: Declared Properties

@property erklärt die Getter und Setter-Methoden, die für die öffentliche Eigenschaft, die Sie implementieren möchten. Zum Beispiel diese Eigenschaft Erklärung:

@property float value; 

entspricht:

- (float)value; 
- (void)setValue:(float)newValue; 

@synthesize bietet Standardimplementierung für diese beiden Accessoren.

Update: Das oben erklärt, was diese beiden tun. Es erklärt nicht, was ihr Zweck ist. :-)

  • @property fügt ein Mitglied der Öffentlichkeit Schnittstelle, die als Datenvariable auf Ihre Klasse Kunden wirkt, sondern gelesen und unter Verwendung von Methoden geschrieben. Dadurch haben Sie eine bessere Kontrolle über die Daten, die zwischen dem Client und Ihrem Code ausgetauscht werden, z. B. können Sie die Werte, die Ihr Code erhält, umfassend überprüfen.
  • @synthesize können Sie nicht explizit den Code schreiben, der vom Client aufgerufen wird, und behandeln die Eigenschaft tatsächlich selbst als Datenvariable.
+0

Ich weiß nicht, ob ich das vollständig verstehe ... warum nicht einfach tun: Wert = 0.0; – esqew

+0

@ seanny94 Siehe diese Frage: http://stackoverflow.com/questions/1568091/why-use-getters-and-setters –

+0

Die Antwort ist teilweise falsch. @property deklariert einen Getter (und/oder Setter). Es erklärt auch einige Aspekte des Verhaltens des Getters/Setter (z. B. beibehalten, kopieren, zuweisen, nicht atomisch). @synthesize stellt eine Standardimplementierung des Accessors (s) basierend auf der @ -Eigenschaft bereit. Keine von beiden erlaubt Ihnen, die Eigenschaft als Datenelement zu behandeln, genauso wenig wie das Schreiben von Standardmethoden-Deklarationen und -Definitionen. – JeremyP

0

Nur ein kurzes Beispiel, warum Sie vielleicht nicht wollen, genau das zu tun „Variable = 0“:

Sagen Sie bitte diese Eigenschaft haben:

@property (nonatomic, retain) id <MyDelegate> theDelegate; 

Jedes Mal, wenn Sie diese Delegaten ersetzen mit einem neuen

self.theDelegate = newObject; 

Wirklich was hap: ein, Ihre synthetisierte Setter und Getter wird die Freigabe/behalten für Sie jedes Mal, wenn Sie es wie so eingestellt Griff PENED war:

[self setTheDelegate:newObject]; 

- (void)setTheDelegate:(id <MyDelegate>)anObject { 
    [theDelegate release]; 
    theDelegate = [anObject retain]; 
} 

(Dies natürlich vereinfacht)

Sie in Ihren eigenen Getter und Setter sehr mächtige Dinge tun können, synthetisieren für diejenigen, die über geschehen ist und über wie beibehalten Eigenschaften usw. Beim Kompilieren schaut es sich deine @property an und baut die Methoden entsprechend auf.

3

Das Symbol "@" wird vom Compiler als Direktive interpretiert. Dies ist eine der Ergänzungen von Objective-C zur C-Sprache. Wenn Sie @property und dann @ synthesize deklarieren, weisen Sie den Compiler an, die Anweisungen und die entsprechenden Symbole für Getter und Setter für Sie zu erstellen. Denken Sie daran, dass in der Sprache C der Operator "=" "assign" bedeutet. Die meiste Zeit im OO-Kontext, den die Objective-C-Erweiterungen bieten, arbeiten wir mit Zeigern (alias Referenzen) zu isa Datenstrukturen (Klassen in Objective-C).

Vor Objective-C 2.0, mussten alle Getter- und Setter-Methoden vom Entwickler für jedes Attribut codiert werden, das in den meisten Fällen ein Copy/Paste-Code war. Um vollständig KVC/KVO-konform zu sein, benötigt man viel sehr langweiligen Code ... willAccessValueForKey, didUpdateValueForKey-Anweisungen usw., die der neue Compiler für Sie automatisch hinzufügt, wenn Sie die Syntax @ property/@ synthesize verwenden. Dies ist ein enormer Produktivitätsschub für Entwickler. Die Punkt-Syntax Ergänzungen der Sprache sind ein wenig umstritten in der Gemeinde, da dies verbirgt sich die Magie der Compiler auf Sie tut Namen der object.property = anotherObject.property; Aussage als [object setProperty:[anotherObject property]];

Von der Apple-Dokumentation in anderen Antworten verwiesen zu interpretieren

Property Erklärung Attribut

Sie können eine Eigenschaft mit Attributen schmücken das Formular @property mit (Attribute [, attribute2, ...]). Wie Methoden werden Eigenschaften auf ihre umschließende Schnittstellendeklaration beschränkt. Bei Eigenschaftsdeklarationen, die eine durch Kommas getrennte Liste von Variablennamen verwenden, gelten die Eigenschaftsattribute für alle benannten Eigenschaften.

Wenn Sie die Anweisung @synthesize verwenden, um den Compiler anzuweisen, die Accessormethode (n) zu erstellen, entspricht der von ihm generierte Code der Spezifikation der Schlüsselwörter. Wenn Sie die Accessormethode (n) selbst implementieren, sollten Sie sicherstellen, dass sie der Spezifikation entspricht (wenn Sie beispielsweise copy angeben, müssen Sie sicherstellen, dass Sie den Eingabewert in der Setter-Methode kopieren).

3

Ich hoffe, das wird Ihnen helfen.

@property und @synthesize wird verwendet, um auf Objekt oder Variable in eine andere Klasse zuzugreifen.

Hier ist ein kleines Beispiel: Dieses First Class

#import <UIKit/UIKit.h> 
#import "ClassB.h" 
@interface ViewController : UIViewController 
@property(nonatomic, retain) NSString *FirstName; 
@property(nonatomic, retain) NSString *LastName; 


#import "ViewController.h" 
@interface ViewController() 
@end 
@implementation ViewController 
@synthesize FirstName, LastName; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.FirstName = @"Ashvin"; 
    self.LastName = @"Ajadiya"; 
    ClassB *ClassBOb = [[ClassB alloc] init]; 
    ClassBOb.ViewCntrlrOb = self; 
    [ClassBOb CallMe]; 
} 
@end 

ist, und dies ist eine andere Klasse:

#import <UIKit/UIKit.h> 
@class ViewController; 
@interface ClassB : UIViewController 
@property(nonatomic, retain) ViewController *ViewCntrlrOb; 
-(void) CallMe; 
@end 

#import "ClassB.h" 
#import "ViewController.h" 
@interface ClassB() 
@end 
@implementation ClassB 
@synthesize ViewCntrlrOb; 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 

-(void) CallMe 
{ 
    NSLog(@"FirstName = %@",ViewCntrlrOb.FirstName); 
    NSLog(@"LastName = %@",ViewCntrlrOb.LastName); 
} 

So können Sie Vorname und Nachname in ClassB Zugriff.

Und Sie drucken:

2012-05-25 14: 38: 10,766 myExample [8751: c07] Vorname = Ashvin 2012-05-25 14: 38: 10,768 myExample [8751: c07] Nachname = Ajadiya

Verwandte Themen