当我们可以使用子类时,为什么我们需要类别?为什么我们在使用函数时需要块?

时间:2014-06-23 11:31:53

标签: ios objective-c block categories

当我们搜索这两个问题时,这两个问题很常见,但我需要得到一个令人满意的答案。当我们搜索子类和类别之间的差异时,我们实际上得到的定义都不是区别< /strong>。我去了一个非常好的MNC工作的面试,我遇到了这两个问题,我几乎给了我在这里读到的所有答案,但面试官并不满意。他坚持他的问题,是在于 -

  1. 为什么我们在使用子类时需要类别?

  2. 为什么我们在使用函数时需要块?

  3. 所以请解释一下我们的对手不能做的具体素质块和类别在目标C中添加的内容。

4 个答案:

答案 0 :(得分:3)

首先...

阅读documentation "Subclassing Notes" for NSString说明为什么创建类别有时候比继承更好。

如果你想将一个函数-(void)reverseString(例如)添加到NSString,那么与类别相比,对它进行子类化将是一个巨大的痛苦。

其次...

块对捕获范围和上下文很有用。他们也可以传播。因此,您可以将块传递给异步调用,然后可以将其传递到其他位置。 TBH你不关心块传递的位置或最终调用它的位置。创建块时捕获的范围也被捕获。

是的,您也可以使用方法。但它们都有不同的用途。

你的问题有点奇怪。这就像问......

  

为什么我们可以使用扳手时会存在锤子?

答案 1 :(得分:1)

  1. 当其他人正在创建对象时,您无法使用子类。例如,NSString从数百个系统API返回,您无法将其更改为返回MyImprovedString

  2. 功能分裂逻辑;块允许你把它写得更近。像:

    [thing doSomethingAndWhenFinishedDo: ^{ some_other_thing; }];

  3. 用函数编写的相同代码会将逻辑的第二部分放在文件中几行。如果你的逻辑中有几个嵌套的作用域,那么块可以真正清理它。

答案 2 :(得分:0)

为什么我们在使用子类时需要类别?

类别允许您扩展现有类的API而不更改其类型。子类化做同样的事情,但引入了一种新类型。另外,子类化允许您添加状态。

为什么我们在使用函数时需要块?

块对象是C级语法和运行时功能。它们类似于标准C函数,但除了可执行代码之外,它们还可能包含对自动(堆栈)或托管(堆)内存的变量绑定。因此,块可以维护一组状态(数据),以便在执行时可以用来影响行为。

您可以使用块来组合可以传递给API的函数表达式,可选地存储并由多个线程使用。块作为回调特别有用,因为块包含要在回调时执行的代码和执行期间所需的数据

答案 3 :(得分:0)

类别:如果我们想要在源不知道的给定类上添加任何方法,则使用它。当我们想要改变任何类的行为时,基本上都会使用它。

For example :如果我们想在NSString上添加一个方法来反转一个字符串,我们可以选择类别。

子类:如果我们想要修改任何类的状态和行为,或者重写任何方法来改变父类的行为,那么我们就去进行子类化。

For example :我们将UIView子类化为改变其iOS代码中的状态和行为。

参考:

<强> When to use categories and when to use subclassing?

What is the difference between inheritance and Categories in Objective-C