문제

이 두 가지 방법 중 하나가 객체를 생성하고 초기화하는 방법 중 하나입니까?

MyClass oClass = [[MyClass alloc] init];
oClass.length = 5;
oClass.text = @"Hello";

또는 동일한 코드가 포함되어 있지만 다음과 같이 보이는 클래스 메소드를 사용합니다.

MyClass oClass = [MyClass myClassWithLength:(int) 5 andText:(NSString *) @"Hello"];

나는 일이 한 가지 이상을 보았을 때 그것을 싫어하고, 하나가 다른 방법보다 낫지는 전혀 모른다, 왜 그런지 전혀 모른다!

도움이 되었습니까?

해결책

증오하지 마십시오. :-)

그건 그렇고, 나는 당신이 의미한다고 가정합니다.

(편집하다: 불필요한 캐스트 제거)

MyClass oClass = [[MyClass alloc] initWithLength:5 andText:@"Hello"];

여러 Init ... 메소드의 이유는 개발자가 올바르게 초기화 된 인스턴스를 작성하는 것이 더 편리하기 때문입니다. 예를 들어, 개발자가 종종 길이와 텍스트로 MyClass 인스턴스를 만들어야한다는 것을 알게되면 API를 한 단계로 수행 할 수있는 API를 제공하여 삶을 더 쉽게 만듭니다. 개발자가 자주 텍스트 문자열로 MyClass 인스턴스를 만들어야한다는 것을 알게되면 -initWithText: 방법.

이 방식으로 생성 된 인스턴스가 자주 임시 객체로 사용되는 경우 (예 : 예를 들어 변수 또는 정적 변수에 저장되지 않음) 등급 편의 메소드를 추가 할 수도 있습니다. +myClassWithText: 이는 제공된 텍스트 문자열로 초기화 된 MyClass의 자동 표시 인스턴스를 반환합니다.

어느 것이 더 나은지 : 가능한 경우 객체를 완전히 초기화하는 것이 항상 좋습니다. 따라서 객체가 두 값을 올바르게 초기화 해야하는 경우 두 인수를 제공 할 수있는 방법을 사용하십시오. 또한 작성된 인스턴스에 대한 참조를 저장할 필요가없는 경우 클래스 편의 메소드를 사용하여 코드가 메모리 관리를 처리 할 필요가 없습니다.

다른 팁

길이와 텍스트없이 객체를 사용할 수 없으면 두 번째 옵션이 더 나을 수 있습니다. 해당 필드가 선택 사항이라면 첫 번째 필드가 더 좋습니다.

그러나 나는이 질문에 절대적인 진실이 있다고 생각하지 않습니다.

속성이 많은 클래스가있는 경우 한 줄의 코드로 모두 초기화 할 가능성이 거의 없습니다. 두 가지 방법 모두 나에게 잘 작동합니다.

만약 initWithSomething: 방법을 사용할 수 있고 해당 속성에 대한 초기 값을 제공하려고합니다. 더 간단하기 때문에 항상 선호합니다. 또한 불변의 수업에서도 항상 작동합니다.

그러나 INIT 방법은 본질적으로 "더 나은"것은 아닙니다. 클래스에는 일반적으로 하나 또는 두 개의 이니셜 라이더가 있으며 다른 모든 것은 기본값을 가진 사람들을 호출합니다. 반드시 인스턴스의 속성을 그대로 유지하지는 않습니다. 클래스에 대한 문서는 이니셜 라이저가하는 일과 클래스의 지정된 이니셜 라이저를 나타냅니다. 예를 들어, [[NSDate alloc] init] NSDate의 지정된 이니셜 라이저를 사용하고 initWithTimeIntervalSinceReferenceDate:, 현재 날짜와 시간을 나타내는 날짜 객체를 만듭니다.

또한 이것은 또한 클래스를 서브 클래스를 클래스 할 때 지정된 이니셜 라이저 만 무시하면됩니다. 다른 사람들은 단지 그것을 부르기 때문에 그들은 당신의 새로운 행동을 무료로 얻습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top