2011-08-23 7 views
1

retain이 NSObject 프로토콜에서 선언되었습니다.NSObject NSObject와 NSProxy에서 모두 alloc이 선언되었지만 retain이 NSObject 프로토콜에 있습니다.

따라서 NSObject 클래스와 NSProxy 클래스가이를 구현합니다.

아직 NSProxy와 NSObject 클래스는 모두 alloc을 가지고 있습니다.

NSObject 프로토콜에서 isnt alloc이 선언 된 이유는 무엇입니까?

측면 질문 : NSObject 프로토콜은 인스턴스 메서드가 NSObject 클래스에있는 메서드의 클래스 버전을 저장하는 데에도 사용됩니다. NSObject 프로토콜에서 클래스와 인스턴스를 모두 선언하는 것을 막을 수 있습니까? 왜 그들을 나눠?

@protocol NSCopying 

- (id)copyWithZone:(NSZone *)zone;  //INSTANCE METHOD version of copyWithZone 

@end 
@interface NSObject <NSObject> { 
    Class isa; 
} 
... 

+ (id)copyWithZone:(NSZone *)zone;  //CLASS METHOD version of copyWithZone 

건배

답변

2

나는이 목표 - C에 필요한 무엇에 의해 결정된다 생각하고, 어떤 것은 구현이 필요합니다.

개체를 만들려면 개체를 할당해야합니다. 이 방법은 alloc 방법으로 수행됩니다. 이것은 objective-c를 사용해야하기 때문에 모든 루트 객체가이를 구현해야 함을 암시합니다. 그러나 참조 카운팅을 통해 메모리 관리를 수행 할 필요는 없습니다. 대신 가비지 콜렉션을 사용할 수 있습니다. 이 때문에 retain 메서드는 objective-c를 사용할 필요가 없습니다. 애플의 구현은 메모리 관리의 한 형태로서 retain 메소드를 만들었다. 그들은 모든 객체에 사용 가능하도록 보장하기 위해 NSObject 프로토콜에 추가했습니다. Cocoa의 모든 루트 클래스는 해당 프로토콜을 준수해야하므로 모두 retain 메서드가 있어야합니다.

클래스는 NSCopying 프로토콜을 준수하여 해당 클래스의 인스턴스를 복사 할 수 있음을 나타낼 수 있습니다. 일반적으로 클래스를 복사하지 않으므로 클래스 메소드가 정의되어 있지 않습니다. 그러나 객체가 클래스인지 인스턴스인지 여부는 알 수 없지만 conformsToProtocol:을 호출하면 같은 값이 반환됩니다. 동일한 이름의 클래스 메소드를 작성하면 인스턴스 또는 클래스가 있는지 여부를 모르는 경우에도 copyWithZone:을 호출하는 것이 안전하다는 것을 알 수 있습니다.

관련 문제