类目(Category)
(1).为已知的类添加新的方法,无论是否知道类的源代码,这些类包括自己定义的类和系统已有的类。
(2).将类的实现分散到多个不同的文件中,将多个类目的声明放入同一个.h文件中,将实现放入多个.m方法中。
(3).使用类目创建对私有方法的前向引用,就是为类创建私有方法。
(4).向对象添加非正式协议,现在逐渐被正式协议做替代。
注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用
注意:
1、类目无法向已有类中添加实例变量。
2、如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,如果方法名冲突,已有类中的原始方法便无法使用。
3、在使用类目的时候,最好是将自己扩展的方法和原始方法区分开来。
NSString+LuisX.h文件中
#import <Foundation/Foundation.h>
#pragma mark - NSString:分类类型 LuisX:分类名
@interface NSString (LuisX) {
//不能在分类中定义成员
}
- (NSInteger)getMyStringLength; //声明实例方法
+ (NSString *)getHomeDirectory; //声明类方法
@end
NSString+LuisX.m文件中
#import "NSString+LuisX.h"
@implementation NSString (LuisX)
//实现实例方法
- (NSInteger)getMyStringLength{
NSInteger stringLength = [self length];
return stringLength;
}
//实现类方法
+ (NSString *)getHomeDirectory{
return NSHomeDirectory();
}
@end
类目演示
//////////类目演示//////////
#import <Foundation/Foundation.h>
#import "NSString+LuisX.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *str = @"FengXu";
NSInteger length = [str getMyStringLength];
NSString *homeDicStr = [NSString getHomeDirectory];
NSLog(@"实例方法: %ld", length);
NSLog(@"类方法: %@", homeDicStr);
//输出: 实例方法: 6
//输出: 类方法: /Users/apple
}
return 0;
}
延展(Extension)
(1).延展的作用就是定义自己的私有方法。
(2).在自己类的实现文件中添加类目(匿名类目)来声明私有方法。(只有本类的.m文件中才能使用)。
(3).形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。
Father.h文件中
#import <Foundation/Foundation.h>
@interface Father : NSObject
- (void)work;
@end
Father.m文件中
#import "Father.h"
//╭--------------------延展(管理私有)--------------------╮
//@interface...@end可省略,但不建议。(方便看出哪些是私有的方法)
//声明私有,()中省略了private
@interface Father ()
@property (nonatomic, copy) NSString *company;
- (void)showMyInfo;
@end
//╰--------------------延展(管理私有)--------------------╯
@implementation Father{
//此处用来定义属性(私有属性)
NSString *_name;
}
- (void)work{
NSLog(@"公有方法");
[self showMyInfo];
}
- (void)showMyInfo{
NSLog(@"私有方法");
}
@end
延展演示
//////////延展演示//////////
#import <Foundation/Foundation.h>
#import "Father.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Father *father = [[Father alloc] init];
[father work];
//输出: 公有方法
//输出: 私有方法
}
return 0;
}
协议(Protocol)
(1).协议声明了可以被其他的类实现方法。协议本身并不会去实现。
(2).协议不是类,只是一个其他对象可以实现的接口。
(3).一个类可以通过协议,用来遵循多个类中的方法,这样可以做到多继承的效果
注意:
@required 必须方法 (默认)
@optional 可选方法
Girl.h文件中
#import <Foundation/Foundation.h>
#warning ▧▧▧▧▧▧▧▧▧▧ 1.声明协议 ▧▧▧▧▧▧▧▧▧▧
@protocol MarriageDelegate <NSObject>
@required //必须方法(默认)
- (void)makeMoney;
- (void)satisfyHer;
@optional //可选方法
- (void)cooking;
@end
@interface Girl : NSObject
#warning ▧▧▧▧▧▧▧▧▧▧ 2.设置代理人属性 ▧▧▧▧▧▧▧▧▧▧
@property (nonatomic, assign) id<Marriage> delegate;
- (void)buybuybuy;
@end
Girl.m文件中
#import "Girl.h"
@implementation Girl
- (void)buybuybuy{
#warning ▧▧▧▧▧▧▧▧▧▧ 3.代理人执行方法 ▧▧▧▧▧▧▧▧▧▧
[self.delegate makeMoney];
}
@end
Boy.h文件中
#import <Foundation/Foundation.h>
#import "Girl.h"
#warning ▧▧▧▧▧▧▧▧▧▧ 4.签订协议 (当前类中要实现必须方法) ▧▧▧▧▧▧▧▧▧▧
@interface Boy : NSObject <MarriageDelegate>
@end
Boy.m文件中
#import "Boy.h"
@implementation Boy
#warning ▧▧▧▧▧▧▧▧▧▧ 6.实现协议中声明的必须方法 ▧▧▧▧▧▧▧▧▧▧
- (void)makeMoney{
NSLog(@"赚钱");
}
- (void)satisfyHer{
NSLog(@"亲吻");
}
@end
协议演示
//////////协议演示//////////
#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
//////////使用代理//////////
Girl *girl = [[Girl alloc] init];
Boy *boy = [[Boy alloc] init];
#warning ▧▧▧▧▧▧▧▧▧▧ 5.指定代理人 ▧▧▧▧▧▧▧▧▧▧
girl.delegate = boy;
[girl buybuybuy];
//输出: 赚钱
//判断是否对象是否遵循某些协议
BOOL result = [girl conformsToProtocol:@protocol(Marriage)];
if (result) {
NSLog(@"遵循Marriage协议");
}else{
NSLog(@"不遵循Marriage协议");
}
//输出: 不遵循Marriage协议
return 0;
}