类别和类扩展的区别?

类别和类别扩展之间有什么区别? 我相信这两个都用于在现有的类中添加自定义方法。 有人可以点亮这个? 用代码实例将非常感激。

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

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

  1. 该类别没有名称。 这是这样宣布的:

      @interface SomeClass()
    
    
    - (void) anAdditionalMethod; 

    @结束

  2. 扩展的实现必须位于文件的主@implementation块中。

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

  1. 类别

    – >在目标c中,当你想为一个没有inheritance的类添加更多的function时,你只需使用它的类别。

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

    – >类别使用添加​​新的方法不属性。

  2. 类扩展

    – >在目标c中,当你想使一些属性的行为私人化,你使用类扩展。

    – >它只带有.m文件。

    – >主要是为了属性。

注意:当我们添加一个新文件,并select一个选项的目标C类别它显示类别和“类别上”而不是“子类”,所以它显示

 @interface className (categoryName) @end 

你得到两个文件.h和.m,文件名为(className + categoryName.h和className + categoryName.m)

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

 @interface className() @end 

– 只有一个名称为className_extensionName.h的文件

  • 在类别中,你不拥有这个课程,但是扩展你。
  1. Category是一种向类中添加方法的方法,无论源代码是否可用,都意味着可以将类添加到NSString等基础类中,也可以添加到您自己的自定义类中。

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

  1. 我们可以在类扩展中添加额外的实例variables和属性,但不能添加到类别中。

  2. 扩展内部的任何variables和方法都不能被inheritance类访问。

  3. 类和扩展都基本上是为了处理大的代码库,而类是扩展类API在多个源文件中的一种方式,而扩展则是在主界面文件的外面添加需要的方法。

  4. 如果您只需要在主界面文件之外的现有类中添加一些必需的方法,则必须根据不同的function和扩展名将相同的类代码拆分为不同的源文件时使用类别。 当你需要在一个类中修改一个公开声明的实例variables的时候。 例如:只读只读,你可以重新宣布它扩展。

我们也可以使用属性在类别类中使用set关联属性。

 @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/

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

我认为这不是申报类别的方法。 类别必须有一个名称

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

例如

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

由苹果宣布为NSMutableArray

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

分类

在创build包含大量方法的文件时使用类别,因此它们为您提供将单个类拆分成不同模块的function。如果对类别进行了任何更改,编译器不会浪费时间来编译整个项目.Categories不能添加新的variables或属性,并查找他们的父类。你可以覆盖一个类中的方法,但它不是一个好主意,因为该方法不能被进一步覆盖。也可以实现stream程,因为所有类别都有在运行时可能存在相同的层次级别,因此属于相同父类的两个类别也可以存在。也可以使用类别创build受保护的方法

扩展

扩展使您可以覆盖该属性或将新属性添加到现有的父类。合成类似于它们没有名称的类别,并表示为@interface class()不存在.m文件并且扩展中声明的方法必须实现在父文件的@implementation中

更多的帮助在这个链接

这是我的理解:

扩展通常用于为我们自己的“ 自定义类 ”添加额外的function。 我们可以添加私有方法或属性来扩展可以在类的实现中使用的类接口。

扩展名将被写入与该类相同的文件中。 因此,你不能写预先定义的types如String,Float等的扩展名

另一方面类别可以用来添加额外的方法到一个预先存在的类。 例如我们可以通过扩展String类来创build我们自己的方法。 请注意,我们不能在类别中创build额外的属性 。 类别的主要优点是我们可以在类别退出的文件之外的任何其他文件中编写类别。

同样,在创build类别时,你应该在括号内给它一个名字。 但是对于扩展,不需要名称。 因此有时它们也被称为匿名类别。

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

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