Ios 何时使用类别Objective-C?

Ios 何时使用类别Objective-C?,ios,objective-c,oop,objective-c-category,Ios,Objective C,Oop,Objective C Category,如果我有一种方法将动画附加到UI元素,而不是将此方法的代码复制/粘贴到多个视图控制器,我可以只创建一个类来保存该方法,然后导入它吗 我假设在本例中使用类别没有意义,因为我需要在多个视图控制器中使用此方法,类别是单个视图控制器的扩展类别是类的扩展,而不是类的特定实例的扩展。而且,类别对类所做的任何修改都可用于所有子类(与OOP中类上的其他方法一样) 因此,如果您在NSObject上添加一个类别,那么整个应用程序中的所有类基本上都可以访问该类别中的方法-因此您需要非常小心添加哪些方法 无论您添加一个

如果我有一种方法将动画附加到
UI元素
,而不是将此方法的代码复制/粘贴到多个
视图控制器
,我可以只创建一个
来保存该方法,然后导入它吗


我假设在本例中使用
类别
没有意义,因为我需要在多个
视图控制器
中使用此方法,
类别
是单个
视图控制器
的扩展类别是类的扩展,而不是类的特定实例的扩展。而且,类别对类所做的任何修改都可用于所有子类(与OOP中类上的其他方法一样)

因此,如果您在
NSObject
上添加一个类别,那么整个应用程序中的所有类基本上都可以访问该类别中的方法-因此您需要非常小心添加哪些方法


无论您添加一个类别还是一个助手类,在很多情况下都是个人偏好,两者都会起作用。

2015年4月9日编辑

您有两个基本选择:

创建一个类别,或创建一个自定义子类

类别 类别允许您将方法添加到整个类,甚至是没有源代码的类。类别对于向系统类中添加新方法特别有用,在系统类中,系统在框架中创建对象,而在框架中,您不能更改内容来创建自定义子类

您可以向UIView这样的基类添加一个类别,并且您添加的方法可以用于该类及其所有子类。因此,您可以将动画类别添加到UIView,然后所有UIView对象(包括图像视图、按钮、滑块等)将获得该类别中定义的方法

类别可以帮助您绕过Objective-C中没有多重继承这一事实。(在上面向UIView添加动画行为的示例中,您不能创建UIView AnimationView的子类,然后创建从UITextView和AnimationView继承的UITextView,也不能创建从AnimationView继承的UIImageView。)

类别有两个重要的限制:

  • 它们不能真正覆盖已有方法的代码。(它们可以,但不能调用超级实现,如果有多个类别具有同一方法的实现,则结果是未定义的,因此不应该这样做。)

  • 类别不能向它们扩展的类中添加新的实例变量。(有一些方法可以使用一种称为关联存储的技术来模拟这种情况,但这超出了本文的范围。)

  • 自定义子类
    自定义子类可以覆盖现有方法。它还可以添加新方法、属性和实例变量。但是,它不能像类别那样向现有子类添加方法。

    类别是子类的替代。当我们向现有类添加方法时,它将成为该类方法的一部分。因此该类的任何实例都可以访问该方法。但是,这并不意味着当您向某些现有类(如NSString或NSArray)添加方法时,该类会将您的方法普遍添加到其定义中。这只意味着在该项目中,您的NSString或NSArray类将有另一个由您定义的方法,以及任何类(在该特定项目内)对其进行子分类,或创建该类的实例时,该方法将作为该类定义的一部分


    因此,您可以通过在UI元素的UIView类中添加一个通过类别的方法,将动画添加到所需的UI元素中。假设您的UI元素是一个按钮。现在,如果您为UIButton创建一个类别,那么,无论何时创建UIButton实例,您都可以自动拥有一个方法来为其设置动画。

    为什么要使用catego举例说明:

    假设你有一个基类引擎,它是由汽车、自行车和滑板车等类继承而来的。这家公司刚刚起步,并愿意添加一个早期未提供的维护功能

    汽车、自行车和滑板车的发动机将根据相同的政策进行维护。因此,最好在发动机类别中添加更多功能,而不是每辆车。这样做时,我们不应该更改发动机类别,因为它可能无法更改。只需创建一个类别

    Engine+Maintenance 
    
    您在维护中使用的所有功能都将在所有子类中可用。这是一种更好的方法


    类别是将单个类定义拆分为多个文件的一种方法。它们的目标是通过模块化类来减轻维护大型代码库的负担。这可以防止源代码成为无法导航的10000多行文件,并使您可以轻松地将类的特定、定义良好的部分分配给个别开发人员

    子类化是向对象添加功能的一种方法,但通过使用类别避免不必要的子类化将有助于减少代码量并使项目更有条理


    类别是特定类别的子类。例如,如果您想在不使用编程代码的情况下更改标签的文本颜色、背景和字体,则必须创建UILabel类别的catogories。

    如果它是UIViewController的类别,并且您的所有控制器都是子类,则可以。谢谢您的解释!是r吗是否应该等同于swift中的扩展?大致上,是的。它们的目的和局限性相似。