Mam dwie różne metody inicjowania mojej klasy cel-c. Jedna jest wartością domyślną, a jedna przyjmuje parametr konfiguracyjny. Teraz jestem całkiem zielony, jeśli chodzi o cel c, ale wdrożyłem te metody i zastanawiam się, czy istnieje lepszy (bardziej poprawny/w dobrym stylu) sposób radzenia sobie z inicjalizacją niż sposób, w jaki to zrobiłem . Czy napisałem te funkcje inicjalizacyjne zgodnie ze standardami i dobrym stylem? Po prostu nie ma sensu sprawdzać istnienia selfPtr
, a następnie zwracać na podstawie tego.celem-c domyślna metoda init dla klasy?
Poniżej znajdują się pliki nagłówkowe i pliki implementacji klas. Ponadto, jeśli zauważysz coś, co jest złe lub złe, daj mi znać. Jestem programistą C++/Javascript, który uczy się celów-c jako hobby i byłby wdzięczny za wszelkie wskazówki, które mógłbyś zaoferować.
#import <Cocoa/Cocoa.h>
// class for raising events and parsing returned directives
@interface awesome : NSObject {
// silence is golden. Actually properties are golden. Hence this emptiness.
}
// properties
@property (retain) SBJsonParser* parser;
@property (retain) NSString* eventDomain;
@property (retain) NSString* appid
// constructors
-(id) init;
-(id) initWithAppId:(id) input;
// destructor
-(void) dealloc;
@end
#import "awesome.h"
#import "JSON.h"
@implementation awesome
- (id) init {
if (self = [super init]) {
// if init is called directly, just pass nil to AppId contructor variant
id selfPtr = [self initWithAppId:nil];
}
if (selfPtr) {
return selfPtr;
} else {
return self;
}
}
- (id) initWithAppId:(id) input {
if (self = [super init]) {
if (input = nil) {
input = [[NSString alloc] initWithString:@"a369x123"];
}
[self setAppid:input];
[self setEventDomain:[[NSString alloc] initWithString:@"desktop"]];
}
return self;
}
// property synthesis
@synthesize parser;
@synthesize appid;
@synthesize eventDomain;
// destructor
- (void) dealloc {
self.parser = nil;
self.appid = nil;
self.eventDomain = nil;
[super dealloc];
}
@end
Dzięki!
Jednym ze szczególnych problemów, które widzę, jest to, że jeśli użyto 'init', to' [super init] 'jest wywoływane dwa razy. – dreamlax
Przeciekłeś również właściwość 'eventDomain', ponieważ tworzysz obiekt z +1 liczbą własności i nadajesz mu metodę, która zwiększa liczbę własności do +2, twoja metoda dealloc przywraca ją do +1.Powinno być 0 w stosunku do twojego obiektu 'awesome'. – dreamlax
Co więcej, dołączenie "Cocoa/Cocoa.h" dotyczy systemu Mac OS X, a nie systemu iOS. – jer