【问题标题】:Why do we needed category when we can use a subclass? and Why we needed blocks when we can use functions?当我们可以使用子类时,为什么我们需要类别?当我们可以使用函数时,为什么我们需要块?
【发布时间】:2014-06-23 11:31:53
【问题描述】:

这两个问题在我们搜索时很常见,但我需要得到一个令人满意的答案。当我们搜索说子类和类别之间的差异时,我们实际上得到了两者的定义,而不是 差异。我去一个在 iOS 上工作的非常好的跨国公司面试,我遇到了这两个问题,我给出了我在这里读到的几乎所有答案,但面试官并不满意。他坚持他的问题并且是那-

  1. 当我们可以使用子类时,为什么还需要类别?

  2. 当我们可以使用函数时,为什么还需要块?

所以请解释一下,在目标 C 中添加了哪些特定品质块和类别是他们的对手无法做到的。

【问题讨论】:

  • 请对 cme​​ts 负分。我可以为我的概念提供一些负分。
  • (我没有投票,但是)你的问题有一些问题:1)在一个帖子中问两个不同的不相关的问题不是一个好主意。 - 2)我很确定这两个问题已经被回答了多次,对于#1,请参见例如stackoverflow.com/questions/8060884/…。如果这些答案不能让您满意,那么您可能应该准确地描述您不理解的部分,而不是您的非常笼统的问题。

标签: ios objective-c block categories


【解决方案1】:

首先...

只需阅读documentation "Subclassing Notes" for NSString 即可了解为什么创建类别有时比子类化更好。

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

第二...

块对于捕获范围和上下文很有用。它们也可以被传递。因此,您可以将块传递给异步调用,然后可以将其传递到其他地方。 TBH,您不在乎块在哪里传递或最终从哪里调用。创建块时捕获的范围也被捕获。

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

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

当我们只能使用扳手时,为什么还有锤子?

【讨论】:

  • +1。我特别喜欢最后一条评论,这让我笑了。我总是从 Apples Secure 编码指南中发现 "Security is not something that can be added to software as an afterthought; just as a shed made out of cardboard cannot be made secure by adding a padlock to the door" 也很有趣
  • @Popeye 哈哈:D 谢谢,我喜欢这句话。还没读过。现在可以去阅读:)
【解决方案2】:
  1. 当其他人正在创建对象时,您不能使用子类化。例如,NSString 是从数百个系统 API 中返回的,您不能将它们更改为返回 MyImprovedString。

  2. 函数拆分逻辑;块允许您将其写得更紧密。喜欢:

    [thing doSomethingAndWhenFinishedDo: ^{ some_other_thing; }];

用函数编写的相同代码会将逻辑的第二部分放在文件中的几行之外。如果您的逻辑中有一些嵌套范围,那么块可以真正清理它。

【讨论】:

    【解决方案3】:

    当我们可以使用子类时,为什么还需要类别?

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

    当我们可以使用函数时,为什么还需要块?

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

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

    【讨论】:

    • 额外的子类化可以让你添加状态..你能详细说明它是怎么做的吗?
    【解决方案4】:

    Category : 如果我们想在一个来源未知的给定类上添加任何方法,则使用它。当我们想要改变任何类的行为时,这基本上会被使用。

    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

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2020-03-23
      • 2020-10-04
      • 2021-11-11
      相关资源
      最近更新 更多