Die Definition einer Eigenschaft in der Klasse iOS-Erweiterung
Ich möchte eine Eigenschaft, um UITableView eine Klasse Erweiterung:
@interface UITableViewController ()
@property NSString *entityString;
@end
Ich dann importieren Sie die Erweiterung und dann benutze ich entityString Eigenschaft in einer Unterklasse von UITableViewController:
@implementation CustomerTableViewController
- (void)viewDidLoad {
self.entityString = @"Customer";
...
[super viewDidLoad];
}
...
Apple-Dokumentation sagt:
der compiler automatisch synthetisieren die entsprechenden accessor
Methoden (...) in der primären Klasse
Umsetzung.
Aber wenn ich versuche es auszuführen bekomme ich diesen Fehler:
-[CustomerTableViewController setEntityString:]: unrecognized selector geschickt Instanz 0x737b670
Was mache ich falsch? vielleicht die Eigenschaft kann nicht zugegriffen werden, die von Unterklassen?
InformationsquelleAutor alazaro | 2012-09-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Klasse Erweiterung wird verwendet, um zu deklarieren zusätzliche Schnittstelle -- Eigenschaften und Methoden -- deren Umsetzung Vertrag erfüllt werden innerhalb der Klasse der primären
@implementaiton
.Das ist genau, warum Sie können nicht hinzufügen von Speicher -- add ivars-über eine Klasse Erweiterung. Eine Klasse Erweiterung ist eine Schnittstelle, nicht mehr, nicht weniger.
@synthesize
ist, was schafft Stauraum für@property
Erklärungen, aber@synthesize
einer@property
können nur in der@implementation
von der Klasse (egal ob explizit oder als default-Verhalten des Compilers).Da kann man nicht kompilieren der framework-Klasse, Sie können nicht hinzufügen ivars.
@prashat die Antwort ist ein Weg, um Speicher hinzufügen, um eine vorhandene Klasse. Allerdings wird diese route ist generell unerwünscht; hängenden Zustand aus der framework-Klassen, wohl oder übel ist ein Zeichen für schlechtes design und wird Ihre Anwendung erheblich erschweren Laufe der Zeit zu halten.
Far besser zu überprüfen Sie Ihre design, wird verstehen, warum Sie derzeit eine Befestigung Zustand auf ein Objekt, das nicht direkt enthalten, und refactoring, die diese Anforderung entfernt.
Sie können erklären, ivars und Eigenschaften in der Klasse Erweiterungen, aber die Lagerung für solche nicht erstellt werden, es sei denn, die Verlängerung wird vom compiler vor dem compilieren der Klasse @Umsetzung.
Vielen Dank für die Klarstellung - ich habe nicht bemerkt, alazaro war mit einer Klasse-Erweiterung für eine framework-Klasse tatsächlich
InformationsquelleAutor bbum
Versuchen Sie, eine Kategorie mit Assoziativen Referenzen statt. Es ist viel sauberer und wird auf allen Instanzen von UIButton.
//Beispiel für die Verwendung
Sie sind sauberer, weil Sie arbeiten (die Klasse Erweiterung nicht, da die Erweiterung nicht anwesend war, wenn die @ - Implementierung für die Klasse kompiliert wurde), aber das macht Sie nicht sauber. Hinzufügen von Staat zu bestehenden framework-Klassen ist ein Zeichen von schlechtem design und hohe zerbrechlichkeit. Während prashant Antwort funktioniert, so ist in der Regel ein Zeichen, dass Sie sollten überdenken Ihre Architektur.
Es gibt keine Notwendigkeit zu verwenden
@dynamic
im code, btw.Dank bbum, korrigiert mich
InformationsquelleAutor prashant
Den docs Status:
Wenn Sie
@property
, es entspricht ungefähr deklarieren accessor-Methoden. So bedeutet dies, Sie können nur tun, eine solche Sache, wenn Sie auch der Autor der "Haupt" -@implementation
block der Klasse, die mit UITableViewController, sind Sie nicht.Ihre einzige option ist hier die Kategorien, die nicht hinzufügen können, Instanzvariablen.
Die docs link, und beachten Sie die Letzte Zeile der Seite:
ein
@property
ist ein ivar plus Accessoren.Ja, ich weiß, aber der compiler übernimmt die Arbeit für Sie. Ich dachte, es könnte hinzufügen Accessoren in der main-Klasse zu, egal ob Sie mir gehört oder nicht.
ist ein ivar plus Accessoren, wenn
@synthesize
verwendet wird (das ist standardmäßig in den neuesten Compiler), ja....Ich denke, dass die docs sind nicht klar genug, oder vielleicht Irre, denn der compiler ist nicht der Erzeugung von Accessoren so heißt es: "der compiler automatisch synthetisieren die entsprechenden accessor-Methoden (...) in der primären Klasse Umsetzung." Der Grund müssen Sie die UITableViewController ist vorkompiliert und kann nicht fügen Sie diese.
InformationsquelleAutor Chris Trahey