@Class 类名; //编译时只有这个类(不包括该类的变量、方法)。常用于复合对象和循环依赖问题中。
id <协议名> _delegate;//代理(实现协议的对象)。
类目、延展、协议都是针对方法。
类目
类目作用:通过创建类目可以为现有的类添加新的方法。
类目只能给已有的类添加方法,无法添加实例变量,此时可以通过字典类型的参数解决。
类目的方法和已有类的方法名称冲突时,类目中的方法会覆盖原有的方法。
通过类目给一个新类添加新方法来扩展这个类不仅影响这个类,同时会影响他的子类,因为他的每个子类都将继承这些新方法。若为NSObject添加类目(即非正式协议)。
延展
方法不在.h头文件声明,直接在.m定义这个方法,相当于私有方法。
协议
步骤:中介中心登记注册-》委托者委托消息
协议SaleHuse
SaleHuse.h
#import <Foundation/Foundation.h> @protocol SaleHouse <NSObject> //@required -(void)saleHouse; -(void)payMoney; @end
HouseSaler.h
#import <Foundation/Foundation.h> #import "SaleHouse.h" @class Landlord; @interface HouseSaler : NSObject <SaleHouse> { Landlord *_customer; } @property(retain,nonatomic)Landlord *customer; -(void)registerInfo:(Landlord *)aCustomer; @end
HouseSaler.m
#import "HouseSaler.h" #import "Landlord.h" @implementation HouseSaler -(void)saleHouse { NSLog(@"我是中介,我替登记者卖房"); [self payMoney]; } -(void)payMoney { NSLog(@"我是中介,我卖了房了"); [self.customer receiveMoney]; } -(void)registerInfo:(Landlord *)aCustomer { self.customer = aCustomer; self.customer.delegate = self;//代理传值? } @end
Landlord.h
#import <Foundation/Foundation.h> #import "HouseSaler.h" @interface Landlord : NSObject { id<SaleHouse> _delegate;//代理(实现协议的对象) } @property(nonatomic,retain)id<SaleHouse> delegate; -(void)saleHouse; -(void)receiveMoney; @end
Landlord.m
#import "Landlord.h" @implementation Landlord @synthesize delegate = _delegate; -(void)saleHouse { NSLog(@"我是房东,我已经将房子登记到中介了"); if ([self.delegate conformsToProtocol:@protocol(SaleHouse)]) { [self.delegate saleHouse]; } } -(void)receiveMoney { NSLog(@"我是房东,钱我收下了,谢谢中介了"); } @end
AppDelegate.m
Landlord *landlord = [[Landlord alloc]init]; HouseSaler *houseSaler = [[HouseSaler alloc]init]; [houseSaler registerInfo:landlord];//房东到中介注册成客户 [landlord saleHouse];