2015-02-07 2 views
2
- (id)init { 
    self = [super init]; 

    if (self) { 
     // initialize instance variables here 
    } 

    return self; 
} 

Apple의 설명서를 읽었을 때, 나는 여전히 위의 내용에 혼란 스럽습니다. 다른 언어에서는 selfthis이라는 개념에 익숙하지만 여기에서는 self을 수퍼 클래스 초기화 self = [super init];에 할당하고 그 결과 nil이 반환되는지 확인합니다. 그렇지만 우리는 마지막 줄에서 자기를 돌려주고 있습니다. 내 말은, 보통 self을 반환하는 것은 "나 자신에게 돌아갑니다"라는 의미입니다. 그러나 selfsuper init으로 이전에 할당 했으므로 super을 대신 self으로 표시하고 self으로 반환하지 않습니까?objective-c init 메소드에서 "self"가 반환되는 이유는 무엇입니까?

편집 - 위와 같이 가능한 한 명확하게하려고했지만 문장에서 자기를 사용하는 것은 까다 롭습니다. 희망을 갖고 누군가가 도울 수 있기를 바랍니다.

답변

0

아니요!

모든 초기화 프로그램은 [super init]으로 전화해야합니다. 즉, 예제에서 호출중인 슈퍼 이니셜 라이저가 똑같은 것을 의미합니다.

모든 이니셜 라이저는 필요한대로 객체를 준비 할 수 있으므로 상속 클래스가 설명하는대로 마침내 사용할 수 있습니다. 그들은 모두 같은 대상에 대해 작업합니다. 객체가 슈퍼 클래스에서 설명하는 모든 것을 처리 할 수 ​​있으므로 모든 슈퍼 클래스가 객체를 초기화해야합니다.

self은 메소드/이니셜 라이저가 객체에 대한 포인터에 지나지 않습니다. 현재 작업중입니다. 그것은 "나 자신을 되찾고있다"와 같은 특별한 의미가 없다.

init 메서드는 개체를 할당하지 않습니다. 이는 [AClass alloc]으로 완료되었습니다.

+0

아, 이제 알았다. 감사합니다 idmean과 micheal welch. 따라서 self는 inits가 부모 클래스에 속해 있어도 상속받은 inits를 호출하는 객체이며 상속받은 객체는 호출 객체 (초기화해야하는 자식 객체)를 자체로 참조합니다. 알았다! –

0

self은 Java 또는 C#의 this과 동일합니다.

self = [super init]; 

선은 처음 초기화의 할 부모 클래스를 허용한다. 모든 것이 좋은 경우 (즉, self != nil) 우리가해야 할 모든 초기화 작업을 수행 할 수 있습니다.

마지막으로 우리는 self을 반환합니다.

부모 클래스와이 클래스에 의해 수행 된 초기화로 구성되어 있다고 설명하는대로 self 또는 ourselves을 기억해야합니다.

업데이트

이 클래스와 부모 클래스 필요가 self을 초기화하기 위해 협력한다. [super init]을 호출하여 부모 클래스의 첫 번째 샷을 제공해야합니다. 완료되면 self으로 참조하는 객체를 반환합니다. 그런 다음이 자식 클래스가 정의하는 인스턴스 변수의 값을 사용하여 self을 초기화합니다. 그러나 두 이니셜 라이저가 동일한 객체에서 작업하고 있습니다.

+1

또한 할당과 초기화 사이에 차이가 있으며 클래스 클러스터도 이와 관련되어 있습니다. – Wain

+0

내가 이해하지 못하는 것은 부모가 자기를 돌려 주면 스스로 돌려주고 있다는 것입니다. 그러나 우리가 자아를 반환 할 때, 우리는 self = [super init]를했을 때 더 일찍 부모에게 우리 자신을 할당했기 때문에 우리는 부모를 돌려주고 있습니다. 아니? –

+0

@Wain 네, 맞습니다. 포스터는 혼란스러워하고 부모 클래스가 하나의 객체를 만들고이 클래스가 다른 객체를 생성하고 있으며이 객체가 아닌 부모 객체를 반환하고 있다고 생각합니다. 나는 주로 부모 init과 init이 동일한 객체를 초기화하는 중임을 지적하려고 노력했다. –

0

내가 이것을 일반인의 언어로 보냅시다.

당신은 객체 지향 프로그래밍을 공부할 때 자동차와 Prius가 Car의 객체 인 방법에 대해 읽었어야합니다. 당신은 기본적으로 Prius, Focus 등과 같이 모든 차량이 Prius, Focus 등 상속받은 수퍼 클래스 Car을 가지고 있습니다. Prius가 자동차, 객체 지향 용어 및 상속 인 경우 Prius는 먼저 Car에서 상속하고 Prius 특정 속성/속성을 추가해야합니다 .

같은 방식으로 Objective-C (모든 객체 지향 프로그래밍 언어)에서 만드는 모든 클래스와 마찬가지로 부모 클래스에서 먼저 상속해야합니다. 루트 클래스는 NSObject (objective-c)입니다.

[super init]은 모든 속성을 사용하여 상위 클래스를 초기화합니다. 성공한 후에는 클래스에 고유 한 속성/속성을 추가합니다.

일반적인 예는 UITableViewCell을 서브 클래스로 만들 때 init 메서드를 재정의 할 때입니다.

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 

    if (self) { 

     UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Foo"]]; 
     imageView.frame = CGRectMake(0, 0, 100, 50); 
     [self.contentView addSubview:imageView]; 
    } 

    return self; 
} 

여기에서 initWithStyle:reuseIdentifier:은 무시됩니다. 먼저 [super initWithStyle:style reuseIdentifier:reuseIdentifier]으로 전화합니다. 기본 설정 인 UITableViewCellstylereuseIdentifier으로 초기화됩니다. UITableViewCell의 모든 속성에 액세스 할 수 있습니다. 또한이 셀에만 해당하는 이미지 뷰가 셀에 추가됩니다.

Object Initialization 문서는 이것을 이해하는 데 도움이됩니다.

관련 문제