类扩展与类的类别
类扩展@interface Class ()
的function更强大,可以将variables注入到类中。 类别@interface Class (Category)
不能。
还有什么其他的区别,什么时候应该使用类扩展的类别?
主要区别在于,使用扩展名时,编译器会期望您在主@implementation
实现这些方法,而对于一个类别,您有一个单独的@implementation
块。 所以,你应该几乎只在你的main .m
文件的顶部使用一个扩展名(顺便说一下,你应该关心ivars的唯一的地方) – 它只是作为扩展名而已。
类扩展与类有一些相似之处,但它只能在编译时join到你有源代码的类中(类与类扩展同时编译)。 由类扩展声明的方法是在原始类的@implementation块中实现的,所以你不能在框架类(例如Cocoa或Cocoa Touch类,如NSString)上声明类扩展。
声明类扩展的语法与类别的语法类似,如下所示:
@interface ClassName () @end
因为在括号中没有给出名称,所以类扩展通常被称为匿名类别。
与常规类别不同,类扩展可以将自己的属性和实例variables添加到类中。 如果你在一个类扩展中声明一个属性,像这样:
@interface XYZAnimal () { id _someCustomInstanceVariable; } ... @end
恕我直言,最好把类扩展看作是一个类的私有接口。 主接口(在你的.h文件中)作为公共接口,定义了类与其他类的行为契约。
使用类别扩展来隐藏私人信息
类扩展通常用于扩展公共接口的其他私有方法或属性,以便在类本身的实现中使用。 例如,在接口中将属性定义为只读属性是很常见的,但是为了使类的内部方法可以直接更改属性值,就像在实现上声明的类扩展中进行readwrite一样。
例如,XYZPerson类可能会添加一个名为uniqueIdentifier的属性,用于跟踪美国的社会安全号码等信息。
它通常需要大量的文书工作才能在现实世界中为个人分配一个唯一的标识符,所以XYZPerson类接口可以声明这个属性是只读的,并提供一些请求标识符分配的方法,如下所示:
@interface XYZPerson : NSObject ... @property (readonly) NSString *uniqueIdentifier; - (void)assignUniqueIdentifier; @end
为了使XYZPerson类能够在内部更改属性,重新声明该类的实现文件顶部定义的类扩展中的属性是有意义的:
@property (readwrite) NSString *uniqueIdentifier;
注意:readwrite属性是可选的,因为它是默认的。 为了清晰起见,您可能会在使用它时使用它。
类别是一种Objective-C语言function,可让您将新方法添加到现有类中。 扩展是类别的特殊情况,可让您定义必须在主实现块中实现的方法。
私有声明可以在类扩展中,主要是一些属性,因为在我们调用它之前我们不需要声明一个方法。
ios扩展类似于c#,java抽象类或接口
ios类似于c#类的扩展
类别是扩展现有类的API的一种方式,而扩展则是在主界面文件之外向API添加所需方法的一种方式。 这两者最初都是为了减轻维护大代码库的负担而devise的。
使用类别的警告:
1-不能可靠地覆盖为同一类别定义的类别中的方法。
2-类别不能添加实例variables。 这意味着你不能声明新的属性。
参考: Objective-C简洁:类别和扩展 。 它用实例进行了详细的讨论。