代码之家  ›  专栏  ›  技术社区  ›  Abhinav

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

  •  82
  • Abhinav  · 技术社区  · 14 年前

    9 回复  |  直到 13 年前
        1
  •  104
  •   Dave DeLong    14 年前

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

    类扩展是一个类别,但有两个主要区别:

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

      @interface SomeClass ()
      
      
      - (void) anAdditionalMethod;
      
      @end
    2. 延伸的实施 必须

    很常见的情况是,在.m文件的顶部有一个类扩展名,它在类的main@implementation部分声明了更多的方法。这是一种声明“pseudo private”方法的方法(pseudo private是因为它们不是真正私有的,只是不对外公开)。

        2
  •  47
  •   user3182143    4 年前
    1. 类别

    =>在Objective C中,当您想在不继承的情况下为类添加更多功能时,只需使用category即可。

    =>它有自己的 h 上午

    => Category

    1. 类扩展
    -> In Objective C, when you want to make behaviour of some property private you use class extension.
    
    -> it comes with **.h** file only.
    
    -> mainly for properties.
    

    注意:当我们添加一个新文件,并选择一个选项的目标c category显示category和“category on”不是“subclass of”所以它 像这样的表演

    @interface className (categoryName)
    @end
    

    -你会得到两个文件 h 类名+类别名.h 类名+类别名.m )

    万一你得到

    @interface className()
    @end
    

    -您将只得到一个名为的文件 类名\u扩展名.h

        3
  •  32
  •   Pang Ajmal PraveeN    6 年前
    1. NSString 以及您自己的自定义类。

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

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

    3. 当您必须根据不同的功能将相同的类代码分解为不同的源文件时,请使用category;当您只需要向主接口文件之外的现有类添加一些所需的方法时,请使用extension。 另外,当您需要修改类中公开声明的实例变量时,例如, readonly要读写,可以在扩展中重新声明它。

        4
  •  7
  •   Pang Ajmal PraveeN    6 年前

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

    类别 :若要在现有类(而不是属性)中添加更多方法,可将其用于自定义类和Apple类 NSString

        5
  •  3
  •   PradeepKN    9 年前

    我们也可以在category类中使用set-associated属性来创建属性。

    @interface SomeClass (Private)
    
    @property (nonatomic, assign) id newProperty;
    
    @end
    
    NSString * const kNewPropertyKey = @"kNewPropertyKey";
    
    @implementation SomeClass (Private)
    
    @dynamic newProperty;
    
    - (void)setNewProperty:(id)aObject
    {
        objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
    }
    
    - (id)newProperty
    {
        return objc_getAssociatedObject(self, kNewPropertyKey);
    }
    
    @end
    

    参考: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/

        6
  •  2
  •   Alexander    11 年前
    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    
    @end
    

    类别必须有名称

    @interface SomeClass (XYZ)
    
    
    - (void) anAdditionalMethod;
    
    
    @end
    

    例如

    @interface NSMutableArray (NSMutableArrayCreation)
    
    + (id)arrayWithCapacity:(NSUInteger)numItems;
    - (id)initWithCapacity:(NSUInteger)numItems;
    
    @end
    

        7
  •  0
  •   Add080bbA    9 年前

    ios扩展类似于c#,java抽象类或接口
    ios类别类似于c#,java类扩展

        8
  •  0
  •   Jagat Dave swift taylor    8 年前

    类别

    类别用于创建包含大量方法。所以呢它们为您提供了将单个类分解为不同类的工具模块。还有如果对类别进行了任何更改,编译器就不会浪费时间来编译整个类别项目.类别无法添加新变量或属性并查找你可以重写一个类别中的一个方法,但这不是一个好主意,因为这个方法不能进一步重写已覆盖。同时流可能会受到影响,因为所有类别都具有相同的层次结构级别,因此在运行时可能存在属于同一父类的两个类别时间。还有可以使用类别创建受保护的方法

    扩展

    扩展使您可以重写属性或向现有父级添加新属性类。语法上与类别相同,它们没有名称,表示为@interface class() 不存在.m文件,扩展名中声明的方法必须在父文件的@implementation中实现

    更多帮助 this 链接

        9
  •  0
  •   iPhoneDeveloper    7 年前

    我的理解是:

    扩展通常用于为我们自己的应用程序添加额外的功能” ". 我们可以添加扩展类接口的私有方法或属性,这些方法或属性可以在类的实现中使用。

    扩展名将写入与类相同的文件中。因此,不能为诸如String、Float等预定义类型编写扩展。

    另一方面,类别可以用来向预先存在的类添加额外的方法。例如,我们可以通过扩展String类来创建自己的方法。请注意,我们 无法创建额外属性

        10
  •  0
  •   Ravi Raja Jangid    4 年前

    类别允许您将方法添加到现有类中,甚至添加到没有源的类中。类别是一个强大的特性,它允许您扩展现有类的功能,而无需子类化。通过使用类别,还可以在多个文件中分发自己类的实现。类扩展类似,但允许在主类内以外的位置为类声明其他必需的API 阻止。

    通过在接口文件中以类别名称声明方法,并在实现文件中以相同名称定义方法,可以向类中添加方法。类别名称表示这些方法是对在别处声明的类的添加,而不是新类。但是,不能使用类别向类添加其他实例变量。

    类别添加的方法成为类类型的一部分。例如,添加到 不可变数组 实例在其剧目中。方法添加到 不可变数组 不可变数组 类型。(这只对静态类型的对象重要,因为静态类型是编译器了解对象类的唯一方法。)

    Category方法可以做任何在类本身中定义的方法可以做的事情。在运行时,没有区别。类别添加到类中的方法由所有类的子类继承,就像其他方法一样。

    category接口的声明看起来很像类接口声明,只是在类名后面的括号中列出了类别名称,并且没有提到超类。除非其方法不访问类的任何实例变量,否则类别必须为其扩展的类导入接口文件:

    #import "ClassName.h"
     
    @interface ClassName ( CategoryName )
    // method declarations
    @end
    

    请注意,类别不能为类声明其他实例变量;它只包含方法。但是,类范围内的所有实例变量也都在类别范围内。包括类声明的所有实例变量,甚至是声明的实例变量 @私人 .

    扩展

    类扩展类似于匿名类别,只是它们声明的方法必须在主目录中实现 @实施 对应类的块。使用Clang/llvm2.0编译器,还可以在类扩展中声明属性和实例变量。

    @interface MyClass : NSObject
    @property (retain, readonly) float value;
    @end
     
    // Private extension, typically hidden in the main implementation file.
    @interface MyClass ()
    @property (retain, readwrite) float value;
    @end
    
    // Notice that (in contrast to a category) no name is given in the parentheses in the second @interface block.
    

    一个类通常也有一个公开声明的API,然后私下声明其他方法,以供类或类所在的框架单独使用。类扩展允许您在主类以外的位置为类声明其他必需的方法 @接口 块,如以下示例所示:

    @interface MyClass : NSObject
    - (float)value;
    @end
     
     
    @interface MyClass () {
        float value;
    }
    - (void)setValue:(float)newValue;
    @end
     
    @implementation MyClass
     
    - (float)value {
        return value;
    }
     
    - (void)setValue:(float)newValue {
        value = newValue;
    }
     
    @end
    

    实施 设置值: 方法必须出现在主 @实施 类的块(不能在类别中实现它)。如果不是这样,编译器将发出警告,指出它找不到的方法定义 设置值: . 官方文件请点击以下链接: source