分類:
作用:對已有的類想增加新的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
Block回調:
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 <NSObject>
- (void) myView:(MYView *) myView clikMYButtonShowAlert:(NSString *)message;
@end
@interface MYView : UIView
@property (nonatomic, weak) id <MyViewDelegate>delegate;
@end
MYView.m:(監聽代理協議定義事件的發生,當事件發生時,就會通知遵守代理協議的對象來工作)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
if([self.delegate respondsToSelector:@selector(myView:clickMYButtonShowAlert:)])
{
[self.delegate myView:self clickMYButtonShowAlert:@"視圖被電擊"];
}
}
在遵守該協議的類中(如ViewController)聲明:
@interface ViewController () <MyViewDelegate>
@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 & KVO
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
官方文檔:
- addObserver與removeObserver要一對一對的使用
- 基本應用就是DataModel的數據改變後,通知View修改界面
- addObserver:selfforKeyPath:@"price"options:NSKeyValueObservingOptionNewcontext:@"context221" 其中的option設置的是接收到的change的數據類型,context設置的數據是在regist的時候設置的,之後沒有其他作用了(可以用來判斷接收到的數據的類型)
OC回調的四種方式:
1. Target-action回調
示例:
[button addTarget:self action:@selector(onClick:)
forControlEvents:UIControlEventTouchUpInside];
2. delegate回調
示例:
#import < Foundation/Foundation.h >
@protocol MyDelegate <NSObject>
@optional
- (void)doSomeThing(); //定義delegate中的方法
@end
@interface MyDelegateManager : NSObject
@property (weak) id<MyDelegate> delegate; //弱引用持有delegate方法,防止相互引用
@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回調“處