target-c метод инициализации по умолчанию для класса? - PullRequest
7 голосов
/ 28 декабря 2010

У меня есть два разных метода для инициализации моего класса target-c.Один является значением по умолчанию, а другой принимает параметр конфигурации.Теперь я довольно зелен, когда дело доходит до target-c, но я реализовал эти методы, и мне интересно, есть ли лучший (более правильный / в хорошем стиле) способ обработки инициализации, чем способ, которым я это сделал,Смысл, я написал эти функции инициализации в соответствии со стандартами и хорошим стилем?Просто нехорошо проверять наличие selfPtr и затем возвращаться на основании этого.

Ниже приведены заголовок моего класса и файлы реализации.Кроме того, если вы обнаружите что-то еще, что является неправильным или злым, пожалуйста, дайте мне знать.Я - разработчик C ++ / Javascript, который изучает target-c как хобби и был бы благодарен за любые советы, которые вы могли бы предложить.

#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

Спасибо!

Ответы [ 4 ]

14 голосов
/ 28 декабря 2010

Когда один инициализатор просто выполняет более сложный инициализатор с некоторыми параметрами по умолчанию, вызывайте его так:

-(id)init {
  return [self initWithAppID:nil];
}

-(id)initWithAppID:(id)input {
  if (self = [super init]) {
    /* perform your post-initialization logic here */
  }
  return self;
}

Обычно вы пытаетесь сделать один из инициализаторов «назначенным инициализатором», то есть он всегда вызывается. В данном случае это -initWithAppID:.

1 голос
/ 28 декабря 2010

Ваш метод init должен вызывать предпочтительный инициализатор initWithAppId: вместо супер реализации.Затем initWithAppId вызывает супер реализацию, как это и происходит.Кроме того, в initWithAppId :, у вас есть if (input = nil), которая всегда будет устанавливать для input значение nil и для значения YESВот правильные реализации.

- (id)init {
    return [self initWithAppId:nil];
}
- (id)initWithAppId:(id)input {
    if((self = [super init])) {
        if(input == nil) input = @"a369x123";
        self.appid = input;
        self.eventDomain = @"desktop";
    }
    return self;
}
0 голосов
/ 28 декабря 2010

default будет тем, кого вы выберете,

[awesome alloc] init];
[awesome alloc] initWithAppId:ID];
0 голосов
/ 28 декабря 2010

Если честно, я вижу это как спорный вопрос.Ваш второй метод инициализации не имеет смысла при получении нулевого аргумента (плюс у вас есть логическая проблема в вашей условной проверке, если input равен nil).В этом случае я хотел бы предоставить один метод инициализации и два метода класса фабрики, которые действуют обычным образом: возвращать автоматически выпущенные экземпляры и в одном из них указать значение по умолчанию.

Например,объявите метод класса:

+ (awesome*)awesome;
+ (awesome*)awesomeWithAppId:(id)foo;

и, например, в вашей реализации для +awesome напишите его так:

+ (awesome*)awesome
{
    return [[[awesome alloc] initWithAppId:@"a369x123"] autorelease];
}

И аналогично, в вашем awesomeWithAppId: что-то вроде этого:

+ (awesome*)awesomeWithAppId:(id)foo
{
    return [[[awesome alloc] initWithAppId:foo] autorelease];
}

Опять же, это может быть только я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...