2010-07-18 9 views
6

나는 ObjC와 Cocoa를 픽업하고 있는데, 이는 프로그래밍에 대한 첫 번째 진지한 시도이기도합니다.InitWith Methods vs. Factory Methods

인스턴스에서 호출되는 initWith 메소드와 클래스에서 호출되는 팩토리 메소드의 차이점에 문제가 있습니다.

먼저 "팩토리"메서드라고 불리는 이유는 무엇입니까? "InitWith"메서드라고 불렀던 것에 대한 적절한 용어가 있습니까?

둘째, 기능상의 차이점은 무엇입니까? 메모리 관리가 의미하는 바는 (팩토리 메소드가 자동 렌더링 된 객체를 반환한다는 것)?

예를 들어 [NSString stringWithString: (NSString*)aString][[NSString alloc] initWithString: (NSString*)aString]의 실제 차이점은 무엇입니까?

[[NSString alloc] initwithString: (NSString  
*)aString]; 

당신은 따라서 메모리 ALLOC에 문자열을위한 공간을 배치 할 ALLOC을

당신의 예에

답변

5

이 두 방법의 차이점은 Cocoa의 object ownership policy에 설명되어 있습니다. 당신은 -initWithString :에서 반환 된 객체를 소유하고 있으므로 반드시 해제해야합니다. 그러나 + stringWithString에서 반환 된 객체를 소유하지 않으므로이를 해제 할 필요가 없습니다. (또한 소유권을 얻고 싶다면 다음을 수행해야합니다. 그것을 유지하십시오).

팩토리 메서드는 프로그래머가 편리하게 이미 만든 개체를 반환하기 때문에 일반적으로 개체를 구성하는 데 사용하는 매개 변수를 사용하여 개체를 반환하기 때문에 호출됩니다.

0

. 그런 다음 aString과 동일한 문자열로 초기화하도록 지시합니다. (NSString *)은 객체 유형의 식별자이므로 aString이 NSString으로 선언됩니다.

나는 보통

NSString * aString = @"String value"; 

같은 aString가 동일 어떤 선언을한다. 당신이 그것을 관리하기 위해 메모리에 뭔가를 ALLOC 경우

당신은

있는 NSString에 대한 모든 것이 설명 될 수있는 코드의

-(void) dealloc {} 

섹션으로 정확한 시간에 그것을 해제해야합니다 애플이 문서는 NSString

+0

이것은 Rugluds와 Audacitor 모두에게 해당됩니다.'initWithString : '메시지를 보낼 때'(NSString *)'을 포함 할 필요가 없습니다. 메소드의 선언 만이 필요합니다 (메소드가 예상하는 유형을 지정하기 위해). 이것을 메시지의 일부로 포함 시키면'aString' 값을 NSString *으로 형변환합니다.'aString'이'NSString *'이면, 이것은 아무것도하지 않고 불필요합니다. 그것이 다른 것이라면 캐스트는 여전히 아무런 도움이되지 않습니다 : 컴파일러를 닫을 것이지만 런타임에는 충돌이 발생합니다. –

0

주요 차이점은

[NSString stringWithString: 
    (NSString*)aString] 
입니다

[[NSString alloc] initWithString: 
    (NSString*)aString] 

당신이 해제에 대한 책임이 있습니다 문자열을 반환하는 반면

는 누구의 메모리 관리를 걱정할 필요가 없습니다 오토 릴리즈 문자열을 반환합니다. 기본적으로 전자는 후자에 대한 지름길이며, 자동 릴리스입니다.

+1

글쎄, "메모리 관리가 걱정할 필요가 없습니다"라는 말은 완전히 이야기가 아니기 때문에 새로운 사람을 잘못 이끌 수 있습니다 ... 예를 들어 결과를 인스턴스 변수 (1)에 할당하면 ' 클래스 메쏘드에서 결과를 유지하기를 원할 것입니다. 그렇지 않으면 인스턴스 var에 접근 할 때 사라질 것입니다. 이것은 ObjC/Cocoa를 처음 접하는 사람들에게 고전적인 실수입니다. (1) 합성 된 setter가있는 속성이 아닌 인스턴스 변수가 속성 속성을 통해 유지되도록 설정됩니다. – Dad

+1

또 다른 일반적인 실수는 인스턴스 변수를 속성과 혼동하는 것입니다. 프로퍼티에 대해 선언 한 메모리 관리 정책 (예 :'retain')은 인스턴스 변수에 아무런 영향을 미치지 않습니다. 인스턴스 변수에 대한 지정은 항상 보유 또는 사본을 포함하지 않는 부작용없이 발생합니다. 따라서 ivar에 할당 할 때 값을 그대로 유지하거나 복사해야합니다. 속성에 할당 만하면됩니다. –

관련 문제