类别和类扩展之间的区别?

Abh*_*nav 83 objective-c

类别和类扩展之间有什么区别.我相信它们都用于在现有类中添加自定义方法.有人可以对此有所了解吗?我们非常感谢您对代码的示例.

Dav*_*ong 101

类别是一种向现有类添加方法的方法.它们通常驻留在名为"Class + CategoryName.h"的文件中,如"NSView + CustomAdditions.h"(当然还有.m).

类扩展是一个类别,除了2个主要区别:

  1. 该类别没有名称.声明如下:

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    Run Code Online (Sandbox Code Playgroud) @结束
  2. 扩展的实现必须位于文件的主要@implementation块中.

在.m文件顶部看到一个类扩展,在类上声明更多方法,然后在类的主@implementation部分实现,这是很常见的.这是一种声明"伪私有"方法的方法(伪私有方式,因为它们不是真正的私有,只是没有外部暴露).

  • 在Class-Extensiosn中,您可以覆盖(公共)只读属性中的属性以进行内部读写.而且由于LLVM 1.5你可以做更多的事情:你现在可以在类扩展中声明实例变量,这样它们就会从常规接口中消失. (13认同)

Anu*_*uni 45

  1. 类别

    =>在Objective C中,当您想要为没有继承的类添加更多功能时,您只需使用类别即可.

    =>它带有自己的.h.m文件

    => Category用于添加新方法而不是属性.

  2. 类扩展

    - >在Objective C中,当您想要将某些属性的行为设为私有时,您可以使用类扩展.

    - >它只附带.m文件.

    - >主要用于物业.

注意:当我们添加一个新文件并选择一个目标c类别的选项时,它会显示类别和"类别"而不是"子类",所以它显示为

@interface className (categoryName)
@end
Run Code Online (Sandbox Code Playgroud)

- 你将获得两个文件 名为.h.m的文件名为(className + categoryName.hclassName + categoryName.m)

在扩展的情况下,你会得到

@interface className()
@end
Run Code Online (Sandbox Code Playgroud)

- 您将只获得一个名为className_extensionName.h的文件

  • 在类别中,您不拥有该类,但在扩展中您是.

  • @Prasanna:类扩展仅带有.m文件,而不是.h (5认同)

Ven*_*ari 31

  1. 类别是一种向类添加方法的方法,无论源代码是否可用,这意味着您可以将类别添加到基础类中NSString,也可以添加到您自己的自定义类中.

    扩展只能添加到源代码可用的类中,因为编译器同时编译源代码和扩展.

  2. 我们可以在类扩展中添加额外的实例变量和属性,但不能在类别中添加.

  3. 扩展内的任何变量和方法甚至不能被继承的类访问.

  4. 类别和扩展都基本上用于处理大型代码库,但类别是一种在多个源文件中扩展类API的方法,而扩展是一种在主接口文件之外添加所需方法的方法.

  5. 当您必须根据不同的功能将相同的类代码分成不同的源文件时使用类别,以及当您只需要在主接口文件外部的现有类中添加一些必需的方法时使用扩展.此外,当您需要在类中修改公开声明的实例变量(例如,readonly to readwrite)时,您可以在扩展中重新声明它.

  • 我读了5个类似的问题,答案很多,这是最好的.谢谢! (3认同)

Ank*_*arg 7

扩展:使方法私有并添加我们自己的自定义类的属性,而不是 Apple 类的属性。

类别:要在现有类中添加更多方法而不是属性,它可以用于自定义类和 Apple 类,如NSString.