两个协议:
// @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:,求大神指教???
Document officiel "Cette méthode existe pour que les objets de classe puissent être utilisés dans les situations où vous avez besoin d'un objet conforme au protocole NSCopying. Par exemple, cette méthode vous permet d'utiliser un objet de classe comme clé d'un objet NSDictionary. Vous devriez ne pas remplacer cette méthode.』
Après avoir lu ce qui précède, c'est en fait très clair.
copy et copyWithZone existent pour servir des objets de classe (class obj) afin que les objets de classe puissent être insérés dans des conteneurs. Et comme une seule copie d'un objet de classe peut exister globalement, les méthodes copy et copyWithZone renvoient simplement self. NSObject implémente la méthode de copie de classe, mais elle ne figure pas dans le fichier d'en-tête.
Sachant cela, les problèmes sont très simples. Tout ce que vous avez à faire est de considérer les méthodes objet.
est une méthode de classe, - est une méthode objet
peut être appelé directement en utilisant le nom de la classe
- doit être appelé avec l'objet de classe instancié
La classe singleton est remplacée par la classe détenue objet -C'est ça
Question (3)