参考文档
- iOS 用Protocol 给类加共享的属性
- iOS开发-Protocol协议及委托代理(Delegate)传值
- iOS 中delegate的理解与使用(传值)
- iOS中的delegate的用法和规范
Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替。
协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,由其它人来实现。
一、Protocol 给类加共享的属性
@protocol AppConfigData <UXYinjectioProtocol>
@property (nonatomic, strong) NSString *version;
@end
@interface AppConfig : NSObject <AppConfigData>
@end
{
AppConfig *config = [[AppConfig alloc] init];
[config bindInjectioWithSuiteName:@"user1"];
config.version = @"1.1";
}
{
AppConfig *config = [[AppConfig alloc] init];
[config bindInjectioWithSuiteName:@"user1"];
NSLog(@"config\n");
NSLog(@"%@\n", config.version);
}
@protocol PeopleData <UXYinjectioProtocol>
@property (nonatomic, assign) float height2;
@property (nonatomic, assign) int age3;
@property (nonatomic ,assign) BOOL isAlive;
@property (nonatomic, copy) NSString *name;
@end
@protocol ManData <UXYinjectioProtocol>
@property (nonatomic, strong) NSArray *nicknames;
@property (nonatomic, strong) NSDictionary *books;
@end
@interface Man : NSObject <ManData, PeopleData>
@end
{
People *people = [[People alloc] init];
[people bindInjectioWithSuiteName:@"bill"];
people.name = @"name";
Man *man = [[Man alloc] init];
[man bindInjectioWithSuiteName:@"bill"];
NSLog(@"%@\n", man.name);
}
AppConfig *config = [[AppConfig alloc] init];
[config bindInjectioWithSuiteName:@"user1"];
config.version = @"1.1";
config = [[AppConfig alloc] init];
[config bindInjectioWithSuiteName:@"user2"];
config.version = @"1.2";
二、protocol协议及委托代理(Delegate)的应用
一般的委托者需要做的事:
1、创建协议(也就是代理要实现的方法)
2、声明委托变量
3、设置代理(也可以在代理中设置)
4、利用委托变量来调用协议方法(也就是让代理者开始执行协议)
代理需要做的事:
1、遵循协议
2、实现协议方法
具体代码实现
1、协议的声明
我们需要用协议来申明哪些方法是被委托出去了.
@protocol MyUIViewDelegate <NSObject>
- (void)func;
@end
2、委托者申明一个属性
委托者里得有一个属性代表被委托者, 注意这个属性是弱引用.
@interface MyUIView: UIView
@property(nonatomic, weak) id<MyUIViewDelegate> delegate;
3、被委托者声明实现了协议
被委托者需要声明自己实现了委托里的协议.
@interface MyUIViewController : UIViewController <MyUIViewDelegate>
@end
4、设置委托
在被委托者里设置自己是委托者的被委托者.嘛,这句话是有些绕.
// viewcontroller. m中
- (id)init
{
MyUIView *myView = [[MyUIView alloc] init]; //对MyUIView进行初始化
myView.delegate = self; // 将MyUIViewController自己的实例作为委托对象
self.view = myView;
}
5、委托事件
在委托者里调用委托的方法.
// MyUIView.m中
- (void)doSomething
{
[self.delegate func];
}
网友评论