2012-02-21 2 views
3

Просто для подтверждения, что правильный способ создания назначенного инициализатора в Objective-C?Назначенный инициализатор в Objective-C

Это правильный способ инициализации иваров?

Можете ли вы предложить мне, что улучшить?

Person.h

@interface Person : NSObject 


@property (nonatomic, retain) NSString *name; 
@property (nonatomic, assign) int age; 
@property (nonatomic, assign) NSString *sex; 
@property (nonatomic, assign) int weight; 

-(id)initWithName:(NSString *)name; 
-(id)initWithName:(NSString *)name age:(int)age; 
-(id)initWithName:(NSString *)name age:(int)age sex:(NSString *)s; 
-(id)initWithName:(NSString *)name age:(int)age sex:(NSString *)s andWeight:(float)w; 


@end 

Person.m

@implementation Person 

@synthesize name = _name; 
@synthesize sex = _sex; 
@synthesize age = _age; 
@synthesize weight = _weight; 

-(id)initWithName:(NSString *)name age:(int)age sex:(NSString *)s andWeight:(float)w 
{ 
    if(self = [super init]) 
    { 
     [self setName:name]; 
     [self setAge:age]; 
     [self setSex:s]; 
     [self setWeight:w]; 
    } 
    return self; 
} 

-(id)initWithName:(NSString *)name age:(int)age sex:(NSString *)s 
{ 
    return [self initWithName:name age:age sex:s andWeight:0]; 
} 

-(id)initWithName:(NSString *)name age:(int)age 
{ 
    return [self initWithName:name age:age sex:0]; 
} 

-(id)initWithName:(NSString *)name 
{ 
    return [self initWithName:name age:0]; 
} 

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

Заранее спасибо!

+0

Если вы вызываете 'init', тогда он вызовет все ваши другие методы init. – beryllium

+0

Небольшое предложение, которое не имеет никакого отношения к вашему вопросу: вы можете сделать 'sex' enum:' typedef enum Sex {UnspecifiedSex, Male, Female} Sex; 'поскольку я сомневаюсь, что у вас будет много разных значений здесь ;-) – DarkDust

+0

Спасибо @ DarkDust! Это имеет смысл. – foho

ответ

6

Верно, на мой взгляд. Вы можете повысить эффективность, вызывая основной метод init из любого другого, поэтому вы не связываете вызовы, но я думаю, что нет большой разницы.

+1

Я не думаю, что вам нужно перезвонить. – JeremyP

+0

@JeremyP, я испанец и мой английский не очень хорошо. Я говорю «цепочка», чтобы ссылаться на метод, который вызывает метод, вызывающий метод и т. Д. Это неправильно? – Gabriel

+2

Да, это правильно. Я думаю, что лучше, если каждый метод init вызывает назначенный инициализатор напрямую, а не через другой метод init. – JeremyP

3

Да, это типичный образец. Назначенный инициализатор имеет все параметры, а простые инициализаторы заполняют значения по умолчанию.

2

Я предлагаю позвонить по телефону -(id)initWithName:(NSString *)name age:(int)age sex:(NSString *)s andWeight:(float)w непосредственно с каждого метода. Он может избежать множества дополнительных исполнений.

Apple recommends against с использованием методов доступа в init или dealloc. У вас есть переменные, такие как _name, и вы можете использовать его.

+1

Я не согласен с вашим последним предложением об использовании переменных экземпляра в методах init. Для свойств, которые были определены и синтезированы как, например, «сохранить», я предпочитаю objetive-c выполнять работу. Еще больше для новых объявлений «сильный» или «слабый», которыми управляет компилятор. – Gabriel

+1

@Gabriel: рекомендация Apple не использовать свойства в init в случае, если методы доступа были переопределены подклассом. – JeremyP

+0

Ах, это правильно и очевидно. В этом случае было бы опасно, если вы используете не переопределенные аксессоры. Раньше я об этом не думал. Но тогда мне интересно, как это сделать в случае «слабых» или «сильных» свойств ARC.И, с другой стороны, я думаю, что даже используя переменные экземпляра, вы будете делать настройки, которые могут быть несовместимы с подклассами для доступа ... Мне нужно подумать об этом некоторое время. – Gabriel