Category:分类、类目,为已有的类添加方法,扩展一个类的功能。添加的方法成为原始类的一部分,能被子类继承。不能添加变量。
为没有源代码的类添加方法。
#import <Foundation/Foundation.h>
//NSString+Say.h文件
@interface NSString (Say)
+ (void)sayHi;
- (NSString *)addSomeString:(NSString *)str;
@end
#import "NSString+Say.h"
//NSString+Say.m文件
@implementation NSString (Say)
+ (void)sayHi
{
NSLog(@"Hi");
}
- (NSString *)addSomeString:(NSString *)str
{
return [self stringByAppendingString:str];
}
@end
Extension:延展,作用为管理类的私有接口。
面向对象编程也叫面向接口编程。
类中对外公开的方法叫接口,Extension的功能是管理内部使用的方法(私有方法)。
代码写在原始类的.m文件中。
#import "Person.h"
@interface Person ()//Extension延展
{
NSInteger _age;//添加实例变量
}
- (void)sayHi;//帮助管理私有方法
@end
Protocol:协议,为一堆方法的声明,只有.h文件,接受协议的对象实现协议中定义的方法。
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
@optional//可选实现
- (void)SayHi;
@required//必须实现(默认)
- (void)eat;
@end
@protocol YourProtocol <NSObject>
- (void)play;
@end
对象的.h文件签名,在.m文件中实现上面协议中的方法。
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface Person : NSObject <MyProtocol,YourProtocol>
@end
delegate设计模式:Protocol的核心使用场景是实现delegate设计模式。
首先建立一个协议DoProtocol.h
#import <Foundation/Foundation.h>
@protocol DoProtocol <NSObject>
@required
- (void)makeMoney;
@optional
- (void)doHomework;
@end
新建一个Gril类(女孩通过协议找一个男孩来实现方法)
#import <Foundation/Foundation.h>
#import "DoProtocol.h"
@interface Girl : NSObject
{
NSString *_name;
id<DoProtocol> _boyFriend;
}
- (id)boyFriend;
- (void)setBoyFriend:(id<DoProtocol>)boyFriend;
- (void)makeMoney;
- (void)doHomework;
- (instancetype)initWithName:(NSString *)name;
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
#import "Girl.h"
@implementation Girl
- (instancetype)initWithName:(NSString *)name
{
if (self = [super init]){
_name = name;
}
return self;
}
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
- (id)boyFriend
{
return _boyFriend;
}
- (void)setBoyFriend:(id<DoProtocol>)boyFriend
{
_boyFriend = boyFriend;
}
- (void)makeMoney
{
[_boyFriend makeMoney];
}
- (void)doHomework
{
[_boyFriend doHomework];
}
@end
一个遵守协议的Boy类
#import <Foundation/Foundation.h>
#import "DoProtocol.h"
@interface Boy : NSObject <DoProtocol>
{
NSString *_name;
}
- (instancetype)initWithName:(NSString *)name;
- (void)setName:(NSString *)name;
- (NSString *)name;
- (void)makeMoney;
- (void)doHomework;
@end
#import "Boy.h"
@implementation Boy
- (instancetype)initWithName:(NSString *)name
{
if (self = [super init]){
_name = name;
}
return self;
}
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
- (void)makeMoney
{
NSLog(@"%@ Make Money...",_name);
}
- (void)doHomework
{
NSLog(@"%@ Do Homework...",_name);
}
@end
main方法中调用
Girl *g = [[Girl alloc]initWithName:@"小花"];
Boy *boy = [[Boy alloc]initWithName:@"小柱"];
[g setBoyFriend:boy];
[g makeMoney];
[g doHomework];
输出结果
2015-01-17 19:41:26.219 OC0116[3355:303] 小柱 Make Money...
2015-01-17 19:41:26.219 OC0116[3355:303] 小柱 Do Homework...