作用:对已有的类想增加新的API方法时,如果使用继承的方式会增加很多类,从而增加代码的维护量。用分类的方法可以轻松扩展类提供的API.
示例:UIImageView+DefaultImage.h:
@interface UIImageView (DefaultImage)
+ (UIImageView *) imageViewWithDefaultImage;
@end
UIImageView+DefaultImage.m:
@implementation UIImageView (DefaultImage)
+ (UIImageView *)imageViewWithDefaultImage
{
UIImage *image = [UIImage imageNamed:@"placeholder"];
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
return imageView;
}
@end
1.定义带Block参数的方法
2.设置Block的回调时间
3.定义Block需要执行的操作
示例:
定义带Block参数的方法: (Task.h)
@interface Task : NSObject
- (void) beginTaskWithCallbackBlock:(void (^)(void)) callbackBlock;
@end
设置Block回调时机:(Task.m)
- (void)beginTaskWithCallbackBlock:(void (^)(void))callbackBlock
{
NSLog(@"开始!3秒后调用Block!");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
callbackBlock();
});
}
定义Block需要执行的操作:
- (void)viewDidLoad {
[super viewDidLoad];
Task *task = [[Task alloc]init];
[task beginTaskWithCallbackBlock:^{
NSLog(@"Block内代码执行中,代码内容可由自己定义(类似参数传递)");
}];
}
什么是协议:多个类共享的一个方法列表!
实现步骤:
添加协议
设置触发协议中方法的时机
在遵守协议的类中,实现该协议的方法
代理:
代理协议:
示例:
MYView.h:(定义代理协议方法,声明delegate属性)
@class MYView;
@protocol MyViewDelegate
- (void) myView:(MYView *) myView clikMYButtonShowAlert:(NSString *)message;
@end
@interface MYView : UIView
@property (nonatomic, weak) id
@end
MYView.m:(监听代理协议定义事件的发生,当事件发生时,就会通知遵守代理协议的对象来工作)
- (void)touchesBegan:(NSSet
if([self.delegate respondsToSelector:@selector(myView:clickMYButtonShowAlert:)])
{
[self.delegate myView:self clickMYButtonShowAlert:@"视图被电击"];
}
}
在遵守该协议的类中(如ViewController)声明:
@interface ViewController ()
@property (nonatomic,strong) MYView *myView;
@end
//设置代理对象:
- (MYView *)myView{
if(!_myView){
_myView = [[MYView alloc]initWith......//balabala
_myView.delegate = self;
}
return _myView;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.myView];
}
//实现协议方法:
- (void)myView:(MYView *)myView clickMYButtonShowAlert:(NSString *)message{
NSLog(@"...");
}
KVC
当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找是否带有someKey的这个方法;如果没有找到方法,程序会继续查找对象是否带有someKey这个实例变量;如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。
注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)
KVO
Key-Value Observing机制的概述
Key-Value Observing (简写为KVO):当指定的对象的属性被修改了,允许对象接受到通知的机制。每次指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察者。
示例参考:http://blog.csdn.net/yuquan0821/article/details/6646400
官方文档:
https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html
注意事项:
1. Target-action回调
示例:
[button addTarget:self action:@selector(onClick:)
forControlEvents:UIControlEventTouchUpInside];
2. delegate回调
示例:
#import < Foundation/Foundation.h >
@protocol MyDelegate
@optional
- (void)doSomeThing(); //定义delegate中的方法
@end
@interface MyDelegateManager : NSObject
@property (weak) id
@end
import "MyDelegateManager.h"
@interface MyDelegateManager ()
@end
@implementation MyDelegateManager
-(void)dothing(){
if(delegate){
[self.delegate doSomeThing]; //这里执行delegate回调
}
}
@end
#import "ViewController.h"
#import "MyCnetralManager.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
MyDelegateManager *manager = [[MyDelegateManager alloc] init];
manager.delegate = self; //将delegate设置为自身
}
- (void)doSomething() { //这里实接口的具体实现,当调用后会执行自身的逻辑
//dosomething
}
@end
3.Notification方式:
/*
第一个参数指需要注册的对象
第二个参数指需要执行的方法
第三个是需要相应的名称
第四个是接受谁发出的通告,nil表示都接受
*/
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doSomething:)
name:kNotification
object:nil];
/*
第一个参数指需要发送至的对象
第二个参数指发送的对象
第三个参数是指需要发送的额外信息
*/
[[NSNotificationCenter defaultCenter] postNotificationName:kNotification
object:nil
userInfo:nil];
4.block回调方式:参见上文”Block回调“处