Objective c 为什么nib加载会选择我的类别?

Objective c 为什么nib加载会选择我的类别?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我已将NSScrollView扩展为不翻转类别(默认情况下为翻转)。然后,我用Interface Builder向我的应用程序添加了一个NSScrollView。NSScrollView已翻转 这怎么会发生?我不在项目的任何源文件中包含我的类别。我只是在某种程度上似乎足够的地方编译它。为了安全起见,我做了一个干净的建筑 最重要的是:我如何改变这种行为?我不希望我的笔尖自动拾取他们能找到的所有类别,另一方面,有时包含它们可能很方便。但我一直认为分类是选择加入,而不是选择退出,因为这里似乎有 有什么

我已将NSScrollView扩展为不翻转类别(默认情况下为翻转)。然后,我用Interface Builder向我的应用程序添加了一个NSScrollView。NSScrollView已翻转

这怎么会发生?我不在项目的任何源文件中包含我的类别。我只是在某种程度上似乎足够的地方编译它。为了安全起见,我做了一个干净的建筑

最重要的是:我如何改变这种行为?我不希望我的笔尖自动拾取他们能找到的所有类别,另一方面,有时包含它们可能很方便。但我一直认为分类是选择加入,而不是选择退出,因为这里似乎有


有什么想法吗?

类别适用于整个班级;程序中任意位置的NSScrollView的所有实例都将选择新行为。因此,覆盖类别中现有的方法通常不是一个好主意;您正在为类的所有用户(而不仅仅是您自己的实例)更改该方法的行为

因此,类别既不是选择加入也不是选择退出;它们是绝对的、压倒一切的。如果类别被编译到程序中,那么该类的每个实例都将受到影响。他们既不能选择加入也不能选择退出;新的行为是由运行时强制强加给它们的。使用类别时请记住这一点


如果您想更改某些实例的行为,那么应该创建NSScrollView的子类(称之为UnflippedScrollView或其他东西)并重写其中的方法。然后在需要无限制滚动视图的地方使用子类。

类别适用于整个类;程序中任意位置的NSScrollView的所有实例都将选择新行为。因此,覆盖类别中现有的方法通常不是一个好主意;您正在为类的所有用户(而不仅仅是您自己的实例)更改该方法的行为

因此,类别既不是选择加入也不是选择退出;它们是绝对的、压倒一切的。如果类别被编译到程序中,那么该类的每个实例都将受到影响。他们既不能选择加入也不能选择退出;新的行为是由运行时强制强加给它们的。使用类别时请记住这一点


如果您想更改某些实例的行为,那么应该创建NSScrollView的子类(称之为UnflippedScrollView或其他东西)并重写其中的方法。然后在需要不间断滚动视图的地方使用子类。

只是为了强调问题中的一些内容:“我的项目中的任何源文件中都没有包含我的类别。我只是在其中编译它,似乎已经足够了。”这是完全正确的。如果类别存在于您的程序中(唯一的要求是由目标生成),那么它会影响整个程序中的类,包括NIB中的所有实例。要进一步说明这一点,请不要用类别覆盖现有方法。一些Apple框架方法本身是按类别实现的。如果两个类别实现相同的方法,则行为未定义。重写应该在子类中完成,而不是在类别中。类别用于添加新方法,而不是覆盖现有方法。Peter观点的后续内容:类别应用于从类别加载点开始的类的所有实例(它们有效地追溯应用于现有实例)。在动态库中实现类别并手动加载类别的情况下,这一点很重要。加载库时,将修改该类。关键是,原则上,类别可以在任何时间点(不仅仅是在应用程序启动时)修改类,使得类别覆盖更加不确定。哦,好吧,我一定完全误解了类别。当我开始思考这个问题时,这种方式更有意义。只是为了强调问题中的一些东西:“我没有在我的项目的任何源文件中包含我的类别。我只是在某种程度上似乎足够的地方编译它。”这是完全正确的。如果类别存在于您的程序中(唯一的要求是由目标生成),那么它会影响整个程序中的类,包括NIB中的所有实例。要进一步说明这一点,请不要用类别覆盖现有方法。一些Apple框架方法本身是按类别实现的。如果两个类别实现相同的方法,则行为未定义。重写应该在子类中完成,而不是在类别中。类别用于添加新方法,而不是覆盖现有方法。Peter观点的后续内容:类别应用于从类别加载点开始的类的所有实例(它们有效地追溯应用于现有实例)。在动态库中实现类别并手动加载类别的情况下,这一点很重要。加载库时,将修改该类。关键是,原则上,类别可以在任何时间点(不仅仅是在应用程序启动时)修改类,使得类别覆盖更加不确定。哦,好吧,我一定完全误解了类别。当我开始思考这个问题时,这样做更有意义。