2012-03-31 16 views
0

Ich habe kürzlich einen Beitrag gelesen, in dem ich nicht mehr die Notwendigkeit habe, sowohl Ivars als auch Eigenschaften auf ViewControllern zu deklarieren, und die doppelten Deklarationen aus meinem Code entfernt habe.iVars verhält sich nicht wie erwartet

Ein wirklich rätselhafte Effekt, den ich bemerkt habe ist, dass, wenn die Eigenschaft eine erklärte Ivar fehlt, wird es durch self. Eg voran werden muss:

CustomVC.h:

@interface CustomVC : UIViewController <UITableViewDelegate,UITableViewDataSource> { 
... 
@property (nonatomic, strong) IBOutlet UITableView *itemsTableView; 

CustomVC .m:

[itemsTableView reloadData]; // cellForRowAtIndexPath not called 
[self.itemsTableView reloadData]; // table view refreshed as expected 

Wenn es ein Problem mit dem Zugriff auf die war Variable ohne self., würde ich eine Kompilierzeit oder Laufzeitfehler erwarten, aber es scheint einfach still zu scheitern, so dass es schwierig zu debuggen variieren.

Antwort

1

Es ist nicht das gleiche, den Ivar (Direktzugriff) aufzurufen und self.myIvar zu verwenden (was eine Accessor-Methode - Eigenschaften - ist).

Wenn Sie den Direct-Ivar-Zugriff verwenden, werden keine Beobachter benachrichtigt und somit keine Ereignisse ausgelöst. Es ist immer am besten, self.myIvar zu verwenden (einige werden jedoch nicht zustimmen).

lesen Sie die answer in the link, die sehr detailliert und sehr interessant ist.

ein weiterer guter Punkt ist, Eigenschaften wie diese zu synthetisieren: („Selbst“ zu vergessen die)

@synthesize myIvar = myIvar_; 

Dies wird sicherstellen, dass Sie einen direkten Zugang zum Ivar versehentlich vermeiden

+0

Das Verhalten Ich bin Sehen ist fast so, als wenn man "Selbst" weglässt, die Eigenschaft simple wird nicht aktualisiert. – Echilon

+0

Ja, ** wenn Sie "self" weglassen. Sie greifen direkt auf den ivar ** zu und verwenden keine Eigenschaft (damit Beobachter nicht benachrichtigt werden), wenn Sie "self" verwenden. Sie greifen auf die Eigenschaft zu und benachrichtigen so die Beobachter, dass sich Ihr Wert geändert hat, usw. – moxy

+0

Ich verstehe es halb. Das Seltsame ist, dass wenn ich zum Beispiel eine Array-Eigenschaft habe, auf die ohne 'self. 'zugegriffen wird, kann ich Objekte hinzufügen und wenn ich danach zähle, ist es immer noch leer. – Echilon

Verwandte Themen