Frage

Eines der Dinge, mit denen ich während des Einbruchs in die Objektiv-C-Programmierung zu kämpfen habe, ist zu verstehen, wie man Eigenschaften manipuliert. Ich bin vielleicht außerhalb meiner Komfortzone, in der eine ordnungsgemäße Codierungssprache im Gegensatz zu Skriptsprachen, an die ich gewohnt bin, die Dinge in Header -Dateien und Implementierungsdateien gewohnt bin, verwirrt mich etwas.

Nehmen wir an, ich habe eine Zeichenfolge. Ich möchte einen Text in diese Zeichenfolge hinzufügen. Was deklare ich in der Header -Datei und was mache ich in der Implementierungsdatei, damit dies ordnungsgemäß funktioniert, und was sind @Property und @Synthesize?

War es hilfreich?

Lösung

In den schlechten alten Tagen vor Objective-C 2.0 war es üblich, Getter und Setter für Ihre Instanzvariablen zu schreiben, z.

@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

Und das ist nur in der einzelnen Fadenumgebung. Für Multithread -Apps wurden noch mehr Dinge benötigt.

Immobilien bieten eine ordentliche Abkürzung für die oben genannten. Die @Property ersetzt beide Erklärungen in der Schnittstelle und gibt dem Anrufer bessere Hinweise auf die Semantik von Getter und Setter. Sie ermöglichen Ihnen auch @synthesizing die Accessors, damit der Compiler den Code automatisch für sie generiert (Sie nicht haben An sie können Sie Ihre eigenen Implementierungen bereitstellen, wenn Sie möchten). All dies kann durch ersetzt werden durch

 @interface Foo : NSObject
{
@private 
    id foo;
}
@property (nonatomic, retain) id foo;
@end

@implementation Foo

// need dealloc to release foo too.

@synthesize foo; 
@end

Das spart ziemlich viel Tippen, aber Sie können auch von der Schnittstelle sehen, dass setfoo ihren neuen Wert behält und dass die Eigenschaft nicht sicher zu verwenden ist (um festzulegen oder bekommen) in einer multitHhread -Umgebung (ohne einen anderen Verriegelungsmechanismus).

Andere Tipps

@property - deklariert eine Eigenschaft mit Zugriffs- und Speichermodifikatoren. Eigenschaften können readonly oder readwrite, nichtatomar oder atomar (Thread Safety), zugewiesen/behalten/kopieren. Eigentlich können Sie einfache Getter- und Setter -Methoden deklarieren wie in der Tigerzeit, aber a @property Hilft Ihnen, alle Aspekte der Immobilie jederzeit zu identifizieren, ohne die Implementierung zu überprüfen.

@synthesize - vereinfacht den Job, wenn Sie eine einfache Eigenschaft ohne komplexe Arbeit in Getter und Setter benötigen. Es definiert eine Standardimplementierung gemäß der Definition von @property.

Endlich Ihre Fragen zur String. Eigenschaften helfen hier nicht, wenn Sie nach etwas Einfachem suchen, sagen wir, sagen wir myObj.string += "abc". Es ist kein objektiver-C-Stil und mit oder ohne Eigentum werden Sie so etwas tun myObj.string = [[myObj string] stringByAppendingString:@"abc"] oder [[myObj string] appendString:@"abc"] Abhängig von der veränderlichen/unveränderlichen Natur des String -Objekts.

Als Fazit: Es ist ein ziemlich großes Thema, alles in einem einzigen Beitrag zu erklären. Ich würde Ihnen empfehlen, Apple-Dokumentation zu lesen und vielleicht ein Buch über Objective-C zu kaufen. Aaron Hillegass schrieb einen - ein guter Start für jeden Anfänger für Objektiv -C und Mac OS X.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top