两个协议:
// @protocol NSCopying
// - (id)copyWithZone:(nullable NSZone *)zone;
// @end
// @protocol NSMutableCopying
// - (id)mutableCopyWithZone:(nullable NSZone *)zone;
// @end
下面是NSObject.h 头文件中的:
// + (id)copyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
// + (id)mutableCopyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
// - (id)copy;
// - (id)mutableCopy;
问题:
(1)- (id)copyWithZone: 和 + (id)copyWithZone:的区别,+ (id)copyWithZone:一般用在什么地方???
(2)我尝试[NSString copy]; 直接用NSString类执行copy操作,也不会报错,- (id)copy;不是对象方法吗???为什么可以当作类方法来使用???
(3)自定义单例类的时候,一般重写- (id)copyWithZone: 还是 + (id)copyWithZone:,求大神指教???
공식 문서 『이 메소드는 NSCopying 프로토콜을 준수하는 객체가 필요한 상황에서 클래스 객체를 사용할 수 있도록 존재합니다. 예를 들어 이 메소드를 사용하면 클래스 객체를 NSDictionary 객체의 키로 사용할 수 있습니다. 이 방법을 재정의하지 마세요.』
위 내용을 읽어보니 사실 매우 명확합니다.
+copy 및 +copyWithZone은 클래스 객체(클래스 obj)를 서비스하여 클래스 객체를 컨테이너에 삽입할 수 있도록 하기 위해 존재합니다. 그리고 클래스 객체의 복사본은 전역적으로 하나만 존재할 수 있으므로 +copy 및 +copyWithZone 메서드는 단순히 self를 반환합니다. NSObject는 복사 클래스 메서드를 구현하지만 헤더 파일에는 없습니다.
이것을 알면 문제는 매우 간단합니다. 객체 메소드를 고려하면 됩니다.
+는 클래스 메소드이고, - 객체 메소드입니다.
+ 클래스 이름을 사용하여 직접 호출할 수 있습니다.
- 인스턴스화된 클래스 객체로 호출해야 합니다.
싱글톤 클래스는 보유 클래스에 의해 재정의됩니다. 객체 - 바로 그거야
질문(3)
으아악 으아악