【问题标题】:When to use Categories Objective-C?何时使用类别 Objective-C?
【发布时间】:2014-04-15 13:39:41
【问题描述】:

如果我有一种方法可以将动画附加到UI Element,而不是将这个方法的代码复制/粘贴到许多viewcontrollers,我可以只创建一个class 到持有方法,然后导入它?

我认为在这种情况下使用category 没有意义,因为我需要在多个viewcontrollers 中使用此方法,而category 是单个viewcontroller 的扩展。

【问题讨论】:

  • 如果它是 UIViewController 的一个类别并且你所有的控制器都是后代,这很好。

标签: ios objective-c oop objective-c-category


【解决方案1】:

类别是类的扩展,而不是类的特定实例。而且,类别对类所做的任何修改都可用于所有子类(与 OOP 中类的其他方法一样)。

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

在很多情况下,无论是添加类别还是助手类都是个人喜好,两者都可以。

【讨论】:

  • 感谢您的解释!
  • 它是否大致相当于swift中的扩展?
  • 大概,是的。它们的目的和限制相似。
【解决方案2】:

为什么要通过示例使用类别:

假设您有一个基类引擎,它被 Car、Bike 和 Scooter 等类继承。公司刚刚起步并愿意添加之前未提供的维护功能。

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

Engine+Maintenance 

您在维护中投入的所有功能都将在所有子类中可用。更好的方法。

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

【讨论】:

    【解决方案3】:

    2015 年 4 月 9 日编辑

    您有两个基本选择:

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

    类别

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

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

    类别可以帮助您解决在 Objective-C 中没有多重继承这一事实。 (上面给UIViews添加动画行为的例子,不能创建UIViewAnimationView的子类,然后创建继承自UITextView和AnimationView的UITextView,同时创建继承自AnimationView的UIImageView。)

    类别有几个重大限制:

    1. 它们不能真正覆盖现有方法的代码。 (可以,但不能调用超级实现,如果有多个类实现同一个方法,结果是不确定的,所以不应该这样做。)

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

    自定义子类

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Category.html

        【讨论】:

          【解决方案6】:

          categories 是特定类的子类。例如,如果你想在没有编程代码的情况下更改标签的文本颜色、背景和字体,那么你必须创建一个 UILabel 类的类。

          【讨论】:

            猜你喜欢
            • 2010-09-26
            • 1970-01-01
            • 2016-08-02
            • 2011-01-03
            • 2012-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多