2010-11-23 15 views
0

Kann mir jemand erklären, was hier passiert, auf den ersten Blick würde ich das für eine schlechte Praxis halten. Meine Frage ist: In dem Beispiel unten erstelle ich einen neuen Getter für Modell mit - (id) -Modell (d. H. Das Original aus der @Eigenschaft überschreiben), oder maskiere ich nur den @property-Getter mit dieser neuen gleichnamigen Methode?iVar Getter/Methode mit dem gleichen Namen?

@implementation PlanetController 
@synthesize model; 
@synthesize planetLabel_01; 
@synthesize planetLabel_02; 
@synthesize planetLabel_03; 

- (id)model { 
    if(!model) { 
     PlanetModel *tempModel = [[PlanetModel alloc] init]; 
     [self setModel:tempModel]; 
     [tempModel release]; 
    } 
    return model; 
} 

Macht das Sinn?

Gary.

+0

möchten Sie wahrscheinlich @ @ property (Getter = Modell) ID-Modell verwenden, aber ich weiß es nicht sicher. –

Antwort

0

Sie haben Ihren eigenen Accessor für die Modell Eigenschaft implementiert. Das ist eine absolut gültige Aufgabe. Sie können überprüfen, ob Ihre Implementierung ausgeführt wird, wenn Sie entweder aPlanetController.model oder [aPlanetController model] ausführen.

0

Es ist OK für mich aussieht, aber man kann es immer überprüfen, indem Sie die Methodennamen zur Laufzeit auszudrucken.

#import <objc/objc.h> 
#import <objc/runtime.h> 
#include "SFUtility.h" 

/*! 
@abstract spits out the objc/runtime.h information for the class 
*/ 
void SFInvestigateOBJC(id obj) { 


    unsigned int total_method_count = 0; 
    Method * method_list = class_copyMethodList(object_getClass([obj class]), &total_method_count); 
    @try 
    { 
     SFLog(@"ClassName: %s", class_getName(object_getClass([obj class]))); 
     SFLog(@"ClassName: %@", [obj class]); 
     uint method_counter = 0; 
     for (method_counter = 0; method_counter < total_method_count; method_counter++) 
     { 
      Method method = method_list[method_counter]; 
      // check if method the KVC getter you are interested in 
      SFLog(@"Method: %s", sel_getName(method_getName(method))); 
     } 
     NSDictionary *props = [[obj entity] propertiesByName]; 
     for (NSString *s in [props allKeys]) { 
      SFLog(@"KVC: %@", s); 
     } 
    } @catch (NSException *e) { 
     SFError(@"Exception: %@", [e description]); 
    } 

    @try { 
     SFLog(@"Entity: %@",[[obj entity] name]); 
     SFLog(@"EntityClassName: %@", [[obj entity] managedObjectClassName]); 
    } @catch (NSException * e) { 
     SFError(@"Exception: %@", [e description]); 
    } 

} 
3

Was Sie tun, ist keine schlechte Übung. Sie überschreiben oder maskieren nichts. @ synthesize synthetisiert nur, was benötigt wird. In diesem Fall der Setter.

2

Wie alle anderen gesagt haben, ist das absolut in Ordnung. Ihre Modellmethode wird anstelle der synthetisierten verwendet.

jedoch vorsichtig sein: Sie haben eine Methode implementiert haben, die nicht atomar ist, damit Ihre Eigenschaft sollte die folgende Erklärung haben:

@property (nonatomic, retain) id model; 

sonst ist es um seine Umsetzung liegt.

+0

Hallo Jeremy, ich habe es deklariert als: @property (nonatomic, behalten) PlanetModel * -Modell; Ist das zu spezifisch und ich sollte ID wie in deinem Beispiel verwenden? – fuzzygoat

+0

Ah ich sehe, um "- (id) model {" Ich denke, mein vorheriger Kommentar wäre in Ordnung, wenn ich den Getter zu "- (PlanetModel *) Modell {" – fuzzygoat

Verwandte Themen