2017-03-21 1 views
1

의 지역 변수 우리는 클래스의 인스턴스를 인스턴스화에 대한 다음 패턴에 익숙하다 :목표 - C 클래스 메서드 유형 "자기"

+ (instancetype)createInstance { 
    return [[self alloc] init]; 
} 

이 경우 "자기"를 참조하기 때문에이 작품 클래스 청사진에서 빌드 된 객체가 아닌 클래스입니다.

우리는이 선언을 알고는, 가장 일반적으로 사이클을 유지 방지에 사용 :

typeof(self) someStrongSelf = self; 

이것은는 self의 유형은 동적 수와 상관없이 클래스를 필요한 곳마다 그 코드를 복사하여 붙여 넣을 수 있습니다.

클래스 메소드에서 인스턴스 위의 두 가지 패턴 조합과 내 질문에 거래

:

+ (instancetype)createInstance:(MyObject*)dependency { 
    typeof(self) instance = [[self alloc] init]; 
    instance.dependency = dependency; 

    return instance; 
} 

이는 self 때문에 작동하지 않습니다 클래스이며, typeof(class) 그냥 Class이지만, 거기에 일부입니다 메커니즘을 typeof (인스턴스)와 동일한 유연성을 허용하는 instancetype에 해당하는 로컬 변수에 사용할 수 있습니까? 예를 들어 : 오브젝티브 C가 원하는 선언을 허용하는 경우 정말이 공식화 원한다면

+ (instancetype)createInstance:(MyObject*)dependency { 
    instanceof(self) instance = [[self alloc] init]; //desired keyword 
    instance.dependency = dependency; 

    return instance; 
} 

은,이 대안은 위와 같이 기본적으로 같은 일을하는 프로토콜을 정의하는 것입니다 알고,하지만 난 궁금 스타일을 그대로 유지합니다.

+0

@Rob에 동의합니다. 왜 당신이 그것을 너무 일반적으로 유지하려고하는지 확신 할 수 없습니다. TheClass * instance = [[TheClass alloc] init]; instance.dependency = dependency;' –

+0

내 질문에는 실용적인 이유가별로 없다는 것을 인정합니다. 나는'[[self alloc] init]에 대한 호출을 강력하게 타이핑했다. 키워드를 간과하면 궁금했다. 하지만 그 전에 Objective-C와 관련된 모든 의문 질문에 나온 것 같아요 ... – Chris

답변

0

내가 찾는 것을 이해하지만 instanceof(self) 패턴이 없습니다.

@interface Foo: NSObject 
@property (nonatomic, copy) NSString *string; 
@end 

@implementation Foo 
+ (instancetype)fooWithString:(NSString *)string { 
    Foo *foo = [[self alloc] init]; 
    foo.string = string; 
    return foo; 
} 
@end 

@interface Foobar: Foo 
// perhaps some more properties here 
@end 

@implementation Foobar 
// and perhaps some more methods here 
@end 

이 구현이 편리한 메소드는 여전히 서브 클래스를 허용 보여줍니다 틀림 typeof(self) 패턴의 우아함이없는 있지만 다음은, 당신이 원하는 것을 얻을 수있다. 즉, 당신은 할 수 있습니다 :

Foobar *foobar = [Foobar fooWithString:@"baz"]; 

그리고 결과 객체는 Foobar 인스턴스가 될 것입니다.

+0

그게 일반적으로 따라 패턴입니다. 수업 관점에서 '자기'와 보완적인 키워드가 없다는 점에 실망감을 느낀다. 그러나 무엇을 할 수 있을까? – Chris