声明类目:
a 现有的类名位于@interface之后,其后是(类目名),类目名有唯一值,但可以有任意个不同的类目名
eg: @interface 类名(类目名)
@end
b 不可以添加新的实例变量
c 类目的中优先级最高
Category的使用场景有那些呢 : 1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现 2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。 Category能实现上面的需求,当然也有使用Category是需要注意的问题: 1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。 2、Category可以重载原始类的方法,不过不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。 3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
类的延展:extension .m中写代码
a 类的延展也可以将方法变为类的私有方法
b 只能在.m文件里边通过self来调用私有方法,隐藏了内部的实现。
协议Protocol
a .协议声明了可以被其他的类实现的方法。
b 协议本身必不会去实现。协议不是类,只是一个其他对象可以实现的接口。
协议声明:
@protocol 协议名称
@required //必须实现
…………...
@optional //不一定实现
……...
@end
•可以通过对象的 conformsToProtocol :@protocol(协议名)来判断是否遵循某协议
respondsToSelector:@select(方法名)
•创建了NSObject的类目之后,类目中声明方法对于NSObject的子类来说如何检查是否实现了哪个方法
•因为可能要调用某个NSObject类目中声明的方法,在调用时需要判断是否能够响应才行,否则会造成程序崩溃
复制:
–浅层复制的对象只是指向现有的引用对象
–深层复制将复制对象所有内容,包括其引用的对象
•如果需要进行对象的复制,首先对象的类需要采用NSCopying或者NSMutableCopying协议
•以上可以看出如果采用NSCopying协议,那么需要实现
copyWithZone:方法
•当调用对象copy:方法时,会转向copyWithZone:方法的调用
•如果采用NSMutableCopying协议,那么需要实现mutableCopyWithZone:方法
•当调用对象mutableCopy:方法时,会转向mutableCopyWithZone:方法的调用
•一般我们在copyWithZone:方法中实现浅拷贝, 在mutableCopyWithZone:方法中实现深拷贝
eg: //NSCopying
-( id )copyWithZone:( NSZone *)zone{ return [ self retain ]; } //NSMutableCopying -( id )mutableCopyWithZone:( NSZone *)zone{ Student *st=[[ Student allocWithZone :zone] init ]; return st; }
a 现有的类名位于@interface之后,其后是(类目名),类目名有唯一值,但可以有任意个不同的类目名
eg: @interface 类名(类目名)
@end
b 不可以添加新的实例变量
c 类目的中优先级最高
Category的使用场景有那些呢 : 1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现 2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。 Category能实现上面的需求,当然也有使用Category是需要注意的问题: 1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。 2、Category可以重载原始类的方法,不过不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。 3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
类的延展:extension .m中写代码
a 类的延展也可以将方法变为类的私有方法
b 只能在.m文件里边通过self来调用私有方法,隐藏了内部的实现。
协议Protocol
a .协议声明了可以被其他的类实现的方法。
b 协议本身必不会去实现。协议不是类,只是一个其他对象可以实现的接口。
协议声明:
@protocol 协议名称
@required //必须实现
…………...
@optional //不一定实现
……...
@end
•可以通过对象的 conformsToProtocol :@protocol(协议名)来判断是否遵循某协议
respondsToSelector:@select(方法名)
•创建了NSObject的类目之后,类目中声明方法对于NSObject的子类来说如何检查是否实现了哪个方法
•因为可能要调用某个NSObject类目中声明的方法,在调用时需要判断是否能够响应才行,否则会造成程序崩溃
复制:
–浅层复制的对象只是指向现有的引用对象
–深层复制将复制对象所有内容,包括其引用的对象
•如果需要进行对象的复制,首先对象的类需要采用NSCopying或者NSMutableCopying协议
•以上可以看出如果采用NSCopying协议,那么需要实现
copyWithZone:方法
•当调用对象copy:方法时,会转向copyWithZone:方法的调用
•如果采用NSMutableCopying协议,那么需要实现mutableCopyWithZone:方法
•当调用对象mutableCopy:方法时,会转向mutableCopyWithZone:方法的调用
•一般我们在copyWithZone:方法中实现浅拷贝, 在mutableCopyWithZone:方法中实现深拷贝
eg: //NSCopying
-( id )copyWithZone:( NSZone *)zone{ return [ self retain ]; } //NSMutableCopying -( id )mutableCopyWithZone:( NSZone *)zone{ Student *st=[[ Student allocWithZone :zone] init ]; return st; }