Objective - C类的扩展
有关类的笔记
- 通过 “category” 给现有的类添加方法
已经定义了类OYCat.然而当OYCat的源码不便直接修改的时候,可以通过添加一个类别(category)来为OYCat添加新方法。
作用:
(1)给没有.m文件的类添加方法
(2)类目中的方法,子类会自动继承
(3)有利于多人一起开发同一个类。
(4)在只需要一个类的部分方法时,可以只import这部分方法的头文件,有利于缩减代码量。
通用格式:
定义:
@interface ClassName (CategoryName)
method1;
@end
实现:
@implementation ClassName (CategoryName)
method1{
}
@end
针对OYCat(我自定义的一个类,用来举个例子):
定义:
@interface OYCat (meow)
method1;
method2;
@end
实现:
@implementation OYCat (meow)
method1{…}
method2{…}
@end
这样添加的方法,OYCat以及其子类都可以用。
通常把这样的方法的定义和实现放在单独的头文件和源文件里面,命名通常是“类名+类别”,比如:OYCat+meow.h和OYCat+meow.m。(其实现在的Xcode在新建文件的时候选择category,它自动帮着命名)
在用的时候,别忘了要把新方法的头文件include进来。
Note:
(1)在用的时候,别忘了要把新方法的头文件include进来。
(2)类目中不可以添加实例变量。
(3)给类新定义的方法,方法名不能够是用过的,比如不能和OYCat类(或其父类)原有的方法重名,也不可以和OYCat(或其父类)其他类别里的方法重名。
Best Practice:
为了避免重名发生,推荐给方法名加前缀,比如把method1改为oy_method1;
-类的延展(也叫匿名类目)
直接对类进行扩展,向类中添加新方法和属性。这些方法属于内部方法和内部属性,只有对象本身可以对它进行操作。新的属性和方法的定义和实现需要按如下方法:
作用:
给类添加私有方法和私有属性。
定义:
@interface ClassName ()
@property NSObject *extraProperty;
method1;
method2;
@end
实现:
对于新的属性,编译器视它同类本身有的属性是一样的,会自动实现它的getter和setter方法。
对于新的方法,需要直接在这个类本身的.m文件中去实现,实现方法和原来的方法一样。
Note:该的方法只适用于,向项目中有源文件的类添加方法,也就是说,类和它新添加的方法需要在同时编译才可以。一些OC自带的类,比如NSString这样不能直接修改源码的就不合适。
用途:
让某些属性对本类对象为readwrite,对其他类 的对象为readonly。具体做法如下:
在原来的头文件中声明为readonly的属性
@interface OYCar : NSObject
@property (readonly)NSString * name;
@end
在.m文件 中再次声明(在@implementation前面),并且声明成readwrite。
@interface OYCar ()
@property (readwrite)NSString *name;
@end
@implementation OYCar
…
@end
那么,在该类的对象方法中可以通过 [self setName:@“newName”]或者self.name=@“newName”;来修改name的值了。此时name对其他类 的对象仍为只读的。
此文章是我边看官方文档变总结的。