Objective-C的語言特性(分類,Block,協議,KVC&KVO)

分類:

作用:對已有的類想增加新的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

官方文檔:

https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html

注意事項:

  • 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回調“處

 

發佈了198 篇原創文章 · 獲贊 60 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章