这一章的讲解最好能够对比代码,我将代码放在了github上:
https://github.com/mymdeep/OC_foundation
需要的朋友可以参考一下
类别
在程序的开发过程中,经常会遇到这类情况,例如,我们在使用NSString的时候,需要NSString能够多一些自己需要的方法,比如获取字符串的长度转化成NSNumber类,或者使用UIImage的时候,我们能够增加一个自己需要的压缩方法。
要想实现上述功能,有两种方法,第一种是新写一个类,继承NSString,但是这样创建子类会非常复杂,而且你所使用的所有文件都依赖的是NSString,这样替换也会非常麻烦。
这时可以考虑使用第二种方式,就是类别的方式。
声明
#import <Foundation/Foundation.h>
@interface NSString(NumberConvenience)
-(NSNumber *)lengthAsNumber;
@end//NumberConvenience
@implementation NSString(NumberConvenience)
-(NSNumber *)lengthAsNumber
{
unsigned int length = [self length];
return ([NSNumber numberWithUnsignedInt : length]);
} //lengthAsNumber
@end
然后在需要的代码中实现即可:
NSString* strTest = @"dddsdwesa";
NSLog(@"ccc=%@",[strTest lengthAsNumber]);
局限性
类别虽然好用,但是有两个局限性:
(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。
(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。
协议
协议有些类似Java的接口,所以作用就不多说了,直接进入正题(我是Java出身,所以Java使用的时间较长,接口的好处数不胜数,尤其是对于程序的设计方面)。
声明
@protocol Personable <NSObject>
-(void)info:(NSString*)name;
@end
实现
@interface Student : Person<Personable>
@end
Student类继承Person类,并实现Personable协议,所以需要在Student.m中实现对应的方法info。
-(void)info:(NSString*)name{
NSLog(@"info");
}
更多的开发知识,可以关注我的公众号:
网友评论