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

- (void) myView:(MYView *) myView clikMYButtonShowAlert:(NSString *)message;

@end

@interface MYView : UIView

@property (nonatomic, weak) id delegate;

@end

 

MYView.m:(监听代理协议定义事件的发生,当事件发生时,就会通知遵守代理协议的对象来工作)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    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 & 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

@optional

- (void)doSomeThing(); //定义delegate中的方法

@end

@interface MyDelegateManager : NSObject

@property (weak) id 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回调“处

 

你可能感兴趣的:(IOS,Objective-C)