Dav*_*vid 81 objective-c objective-c-category class-extensions
类扩展@interface Class () 功能更强大,可以将变量注入类中.类别@interface Class (Category)不能.
还有什么其他差异,何时应该在类扩展中使用类别?
jtb*_*des 89
主要的区别在于,通过扩展,编译器将期望您在main中实现方法@implementation,而对于类别,您有一个单独的@implementation块.因此,您几乎只应在主.m文件的顶部使用扩展名(这是唯一一个您应该关注ivars的地方,顺便提一下) - 它只是一个扩展名.
Joh*_*Doe 24
类扩展与类别有一些相似之处,但它只能添加到您在编译时拥有源代码的类(该类与类扩展同时编译).类扩展声明的方法在原始类的@implementation块中实现,因此您不能在框架类上声明类扩展,例如Cocoa或Cocoa Touch类,如NSString.
声明类扩展的语法类似于类别的语法,如下所示:
@interface ClassName ()
@end
Run Code Online (Sandbox Code Playgroud)
由于括号中没有给出名称,因此类扩展通常称为匿名类别.
与常规类别不同,类扩展可以将自己的属性和实例变量添加到类中.如果在类扩展中声明属性,如下所示:
@interface XYZAnimal () {
id _someCustomInstanceVariable;
}
...
@end
Run Code Online (Sandbox Code Playgroud)
恕我直言,最好将类扩展视为类的私有接口.主接口(在.h文件中)充当公共接口,用于定义类与其他类的行为合约.
使用类扩展来隐藏私人信息
类扩展通常用于使用其他私有方法或属性扩展公共接口,以便在类本身的实现中使用.例如,通常在接口中将属性定义为只读,但在实现上方声明的类扩展中为readwrite,以便类的内部方法可以直接更改属性值.
例如,XYZPerson类可能会添加一个名为uniqueIdentifier的属性,用于跟踪美国社会安全号码等信息.
它通常需要大量的文书工作才能在现实世界中为个人分配唯一标识符,因此XYZPerson类接口可能会将此属性声明为readonly,并提供一些请求标识符的方法,如下所示:
@interface XYZPerson : NSObject
...
@property (readonly) NSString *uniqueIdentifier;
- (void)assignUniqueIdentifier;
@end
Run Code Online (Sandbox Code Playgroud)
为了使XYZPerson类能够在内部更改属性,在类扩展中重新声明属性是有意义的,该类扩展在类的实现文件的顶部定义:
@property (readwrite) NSString *uniqueIdentifier;
Run Code Online (Sandbox Code Playgroud)
注意:readwrite属性是可选的,因为它是默认值.为清楚起见,您可能希望在重新声明属性时使用它.
类别是Objective-C语言功能,允许您向现有类添加新方法.扩展是类别的一种特殊情况,它允许您定义必须在主实现块中实现的方法.
私有声明可以在类扩展中,主要是一些属性,因为我们在调用它之前不需要声明方法.
| 归档时间: |
|
| 查看次数: |
55436 次 |
| 最近记录: |