2009-04-22 6 views
1

bar 속성을 가진 NSFoo 클래스가 있습니다. bar 속성이 설정된 NSFoo의 인스턴스를 가져 오는 클래스 메서드가 필요합니다. 이것은 NSString stringWithFormat 클래스 메소드와 유사합니다. 그래서 서명은 다음과 같습니다Objective-C에서 할당 자 클래스 메서드를 만들려면 어떻게해야합니까?

+ (NSFoo *) fooWithBar:(NSString *)theBar; 

그래서 이런 식으로 부를 것이다 :

NSFoo *foo = [NSFoo fooWithBar: @"bar"]; 

을 나는 이것이 올바른 수 있습니다 생각하고 있어요 : 제대로 보이지

+ (NSFoo *) fooWithBar:(NSString *)theBar { 
    NSFoo *foo = [[NSFoo alloc] init]; 
    foo.bar = theBar; 
    [foo autorelease]; 
    return foo; 
} 

합니까를?

+0

당신은 반환에 마지막 두 줄을 결합하여 그것을 조금 단순화 할 수 있습니다, 당신은 아마이 방법을 쓸 것이다, 물론

+ (NSFoo *) fooWithBar:(NSString *)theBar { NSFoo *foo = [[[NSFoo alloc] init] autorelease]; foo.bar = theBar; return foo; } 

: 귀하의 방법은 다음과 같이 쓸 수있다 [foo autorelease]; –

+2

부수적으로 NS 접두어는 Cocoa 클래스 (원래 NextStep 클래스 라이브러리) 용으로 예약되어 있습니다. 이름 충돌을 방지하려면 필요에 따라 클래스에 고유 한 접두사를 사용해야합니다. –

답변

2

예, 구현이 올바르게 보입니다. -[NSObject autorelease]self을 반환하므로 return 문은 return [foo autorelease]으로 작성할 수 있습니다. 일부 사람들은 의도를 명확히하고 모든 메모리 관리 코드를 한 곳에서 유지하므로 autorelease (릴리즈와 반대)를 사용하려는 경우 할당시 객체를 자동 리 레스하는 것이 좋습니다. -[NSFoo initWithBar:]이있는 경우

+ (NSFoo *) fooWithBar:(NSString *)theBar { 
    NSFoo *foo = [[[NSFoo alloc] initWithBar:theBar] autorelease]; 

    return foo; 
} 
+0

한 가지주의 : 이처럼 편리한 생성자를 id를 반환하는 것으로 선언하면 매우 일반적으로 [[self alloc] init]을 수행하므로 하위 클래스에서 작동합니다. – Chuck

2

예. 그것은 옳았다. 그리고 귀하의 구현은 일반적인 관행처럼 보입니다.

관련 문제