Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Objective-C中使用类别重写方法_Objective C_Categories - Fatal编程技术网

在Objective-C中使用类别重写方法

在Objective-C中使用类别重写方法,objective-c,categories,Objective C,Categories,我是否可以使用类类别重写已使用类别实现的方法?像这样: 1) 原始方法 -(BOOL) method { return true; } 2) 重写方法 -(BOOL) method { NSLog(@"error?"); return true; } 这是有效的还是非法的?来自: 尽管Objective-C语言目前允许您使用类别覆盖类继承的方法、甚至类接口中声明的方法,但强烈建议您不要这样做。类别不能代替子类。使用类别覆盖方法有几个明显的缺点: 当类别覆盖继承的 方法,类别

我是否可以使用类类别重写已使用类别实现的方法?像这样:

1) 原始方法

-(BOOL) method {
  return true;
}
2) 重写方法

-(BOOL) method {
  NSLog(@"error?"); 
  return true; 
}
这是有效的还是非法的?

来自:

尽管Objective-C语言目前允许您使用类别覆盖类继承的方法、甚至类接口中声明的方法,但强烈建议您不要这样做。类别不能代替子类。使用类别覆盖方法有几个明显的缺点:

  • 当类别覆盖继承的 方法,类别中的方法 可以像往常一样调用继承的 通过发送至
    super
    的消息实施。 但是,如果类别覆盖了 方法中存在的 类,则无法调用 原始实施

  • 一个类别不能可靠地重写在同一类别的另一个类别中声明的方法。

    这个问题特别重要,因为许多Cocoa类都是使用categories实现的。您试图覆盖的框架定义的方法本身可能已在类别中实现,因此未定义哪个实现优先

  • 某些类别方法的存在可能会导致所有框架的行为改变。例如,如果覆盖NSObject上某个类别中的
    窗口将关闭:
    委托方法,则程序中的所有窗口委托都将使用该类别方法进行响应;NSWindow的所有实例的行为可能会更改。添加到框架类上的类别可能会导致行为上的神秘变化并导致崩溃


您可以通过调整方法或使用技术来做到这一点


否则,两个或多个分类方法的行为是

需要注意的是,一个类别也可以用于重写基类中的现有方法(例如,Car类的drive方法),但您永远不应该这样做。问题在于类别是一个扁平的组织结构。如果您重写Car+Maintenance.m中的现有方法,然后决定使用另一个类别再次更改其行为,则Objective-C无法知道要使用哪个实现。在这种情况下,子类化几乎总是一个更好的选择


从本教程中,旧文档链接已失效;我能找到的最好的替代品是这里:

避免类别方法名称冲突 由于类别中声明的方法是添加到现有类中的,因此需要非常小心方法名称

如果类别中声明的方法的名称与原始类中的方法相同,或者与同一类(甚至是超类)中另一个类别中的方法相同,则在运行时使用哪个方法实现的行为是未定义的。如果您在自己的类中使用类别,则这不太可能成为问题,但在使用类别向标准Cocoa或Cocoa Touch类添加方法时可能会导致问题


苹果使用的是更轻的触摸,但要点是一样的:你会招致灾难,因为不可预知的行为是无声的。

谢谢你,但我已经知道了。我只是想知道我的案子是否合法。我的案例与文件略有不同。:)为什么不同?该文件说,如果原始方法不在某个类别中,则是合法的,但强烈反对。那你就可以做了…谢谢你的建议。我这门语言很差。我从你那里得到了新的信息。重写在超类的类别中声明和实现的类别内方法是否正确?链接已断开,这是新版本吗?