何时使用Categories-C?

Apo*_*llo 5 oop objective-c ios objective-c-category

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

我认为category在这个实例中使用a是没有意义的,因为我需要多个这个方法viewcontrollers,而a category是单个的扩展viewcontroller.

Wai*_*ain 18

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

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

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


Dun*_*n C 12

2015年4月9日编辑

您有两个基本选择:

创建类别,或创建自定义子类.

分类

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

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

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

类别有几个重要的限制:

  1. 它们无法真正覆盖已有方法的代码.(他们可以,但你不能调用超级实现,如果有多个类别使用相同方法的实现,结果是未定义的,所以你不应该这样做.)

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

自定义子类

自定义子类可以覆盖现有方法.它还可以添加新方法,属性和实例变量.但是,它无法像类别一样向现有子类添加方法.