Objective-C类扩展与分类

OC中能动态扩展一个类的实例或类方法。类别的好处在于:能在没有获得源代码的情况下动态的扩展一类的功能。例如: Foundaction框架中的NSString类。

分类命名规则:
类名+分类命名

Xcode中创建Category步骤:

New File -> Objective-C File

Objective-C FileFile Type选择Category 键入自定义分类名称 单击 next 即可。

OC中分类分为两个部分: .h头文件和.m实现文件。

.h头文件中声明要扩展的实例或类方法。
m实现文件中实现对应的声明方法。

.h头文件与类的头文件格式大致相同:

Objective-C
@interface Person (Student)
//....一堆声明的方法(实例或类)
@end

不同的是: 类声明头文件中类名后紧跟的是分号和继承父类,如果有协议则会在尖括号中跟上协议(多个协议以逗号分隔)。而分类头文件中类名称后面紧跟着是小阔号括起来的分类自定义名.

.m文件也与类的实现文件大致相同:

Objective-C
@implementation Person (Student)
//....一堆需要扩展的实现方法
@end

不同的是: 类实现文件中类名后不跟随任何东西。而分类实现文件中类名称后面紧跟着是小阔号括起来的分类自定义名.

如果在分类的声明文件中没有声明方法而直接在分类实现文件中有实现,则这些没有声明的分类方法则属于类的私有方法,因而无法被外界调用。但是可以通过选择器调用对应的分类私有方法。

如果调用为声明的分类方法则会出现如下图错误:

同样,因为分类实在运行时起作用,所以在类中调用未声明的分类方法也会报错:


类扩展:

在类实现文件中直接添加@interface声明部分且没有对应的实现文件,则该声明部分中的成员变量和方法则为私有成员变量和私有方法。该部分总称类扩展(自己理解的)

如下示例:

#import "Person.h"
@interface Person ()
{
    //...声明的私有变量部分
}
    //...声明的私有方法部分
@end
@implementation Person
    //...实现的部分的代码
@end

@interface...@end即为类扩展部分
其中声明的成员变量和方法即为私有成员变量及私有方法。
在类扩展通过@property声明的属性为私有属性。

总结:

  • 分类中不能声明成员变量,而类扩展中可以。
  • 分类小括号中有自定义名称,而类扩展小括号中则没有。
  • 分类中有声明有实现的方法即为公共方法,可被外部访问。类扩展中的变量及方法为私有变量和私有方法,外界无法直接访问(OC中因为没有真正意义上的私有方法,所以可以通过选择器访问)。
  • 如果公有方法与私有方法的声明同名时,只要实现了该方法则该方法为共有方法(经测试)。

猜你喜欢

转载自blog.csdn.net/u014268482/article/details/80581748
今日推荐