初学IOS开发的时候,很多人都会对delegate这个词感到陌生与好奇,delegate其实是一种模式称之为“代理模式”,接下来在篇文章中我们就来一起看一下delegate的用法吧!
在IOS中委托通过协议@protocol来实现,在协议中所声明的方法,不需要在协议中有实现的方法,是由他的实现类来实现(该类需要在头文件中包含‘<协议名>’).
首先先解释一下 “协议”与“委托”这两个是不一样的概念,因为我们在看代码的时候老是会看到他们出现在一起。举个例子什么是“委托”:好比我正在开车,但是开车可不能看手机微信呀,这样很危险,所以我就叫坐在车里的小乔帮我看微信,这样下来我就可以正常开车,当小乔看完微信后就告诉我是里面是什么内容。这就是委托,小乔是我的委托对象。
“协议”protocol:是用来定义对象的属性和行为,有点类似于C++的虚函数。它有两个关键字@required与@optional,前者表示这个协议必须要写的方法,后者表示方法可选。
下面是一个简单的例子。
- #import <UIKit/UIKit.h>
- #import "exampleClass.h"
- @interface MainViewController : UIViewController<myDelegate>
- @end
- ============================
- //
- // MainViewController.m
- // testMyDelegate
- //
- // Created by silicon on 14-5-4.
- // Copyright (c) 2014年 silicon. All rights reserved.
- //
- #import "MainViewController.h"
- @interface MainViewController ()
- @end
- @implementation MainViewController
- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
- {
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- // Custom initialization
- }
- return self;
- }
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- // Do any additional setup after loading the view from its nib.
- exampleClass *example = [[exampleClass alloc] init];
- [example testMyDelegate];
- example.delegate = self;
- }
- - (void)didReceiveMemoryWarning
- {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
- - (void)dealloc{
- [super dealloc];
- }
- - (void)test{
- NSLog(@"hello delegate");
- }
- @end
- ===========================================
- #import <Foundation/Foundation.h>
- @protocol myDelegate
- - (void)test;
- @end
- @interface exampleClass : NSObject{
- NSObject<myDelegate> *delegate;
- }
- @property (strong, nonatomic) NSObject<myDelegate> *delegate;
- - (void)testMyDelegate;
- @end
- ==========================================
- #import "exampleClass.h"
- @implementation exampleClass
- @synthesize delegate;
- //
- - (id)init{
- [super init];
- return self;
- }
- - (void)testMyDelegate{
- [self.delegate test];
- }
- @end
个人认为使用委托的好处就在于,可以在类中实现消息的传递,避免了类与类的耦合度过高。利用委托赋值更加安全可控,委托赋值在不暴露自己类的属性的前提下就可以对自己进行赋值。