2012-02-21 2 views
3

Objective-C에서 지정된 초기화 도구를 만드는 올바른 방법은 무엇입니까?Objective-C의 지정된 초기화 도구

ivars를 초기화하는 올바른 방법입니까?

개선 할 사항을 제안 해 줄 수 있습니까?

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

당신의 질문에 아무런 관련이없는 사소한 제안 :'섹스 '를 열거 형으로 만들고 싶을 수도 있습니다 :'typedef enum Sex {UnspecifiedSex, Male, Female} Sex;'당신이 다른 값을 많이 가질지 모르니까 여기에 ;-) – DarkDust

+0

감사합니다 @DarkDust! 그것은 의미가 있습니다. – foho

답변

6

제 생각에는 정확합니다. 다른 init 함수에서 호출하여 효율성을 높일 수 있으므로 호출을 연결하지 않아도되지만 큰 차이는 없다고 생각합니다.

+1

전화를 연결해서는 안된다고 생각합니다. – JeremyP

+0

@JeremyP, 나는 스페인 사람이고 나의 영어는별로 좋지 않다. 메소드를 호출하는 메소드 등을 호출하는 "chain"을 말합니다. 그게 잘못된거야? – Gabriel

+2

맞습니다. 각 init 메소드가 다른 init 메소드를 사용하는 대신 지정된 initialiser를 직접 호출하는 것이 더 좋다고 생각합니다. – JeremyP

3

그래, 그 전형적인 패턴입니다. 지정된 이니셜 라이저에는 모든 매개 변수가 있으며, 더 간단한 이니셜 라이저는 기본값을 채 웁니다.

2

각 방법에서 직접 -(id)initWithName:(NSString *)name age:(int)age sex:(NSString *)s andWeight:(float)w으로 전화하는 것이 좋습니다. 여러 번의 추가 실행을 피할 수 있습니다.

Apple recommends againstinit 또는 dealloc의 접근 자 방법을 사용합니다. _name과 같은 변수가 있으며이를 사용할 수 있습니다.

+1

init 메소드에서 인스턴스 변수를 사용하는 마지막 문장에 동의하지 않습니다. 예를 들어 'retain'과 같이 정의되고 합성 된 속성의 경우 objetive-c를 사용하여 작업을 수행하는 것이 더 좋습니다. 컴파일러가 관리하는 새로운 선언 인 '강'또는 '약'에 대해서도 마찬가지입니다. – Gabriel

+1

@Gabriel : 접근 자 메소드가 서브 클래스에 의해 오버라이드 된 경우 init에서 프로퍼티를 사용하지 않는 것이 Apple의 권장 사항입니다. – JeremyP

+0

아, 맞습니다. 분명합니다. 이 경우 오버라이드 된 접근자를 사용하지 않는 경우 위험 할 수 있습니다. 나는 그 사건을 전에 생각하지 않았다. 그런데 ARC 'weak'또는 'strong'속성의 경우 어떻게하는지 궁금합니다.그리고 다른 한편으로는 인스턴스 변수를 사용한다고해도 하위 클래스 접근 자와 호환되지 않는 설정을 수행 할 것이라고 생각합니다. 잠시 생각해야합니다. – Gabriel

관련 문제