注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

技术乐土

这是一片技术的乐土

 
 
 

日志

 
 

(一)iOS什么是delegate and protocol  

2014-12-03 13:05:44|  分类: iOS |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


  1. protocol类似C++中的抽象类和Java中的interface。分为Formal protocol和informal protocol两种,其中在Objective C 2.0之前,informal protocol是Cocoa中实现delegate的重要基础。因为Objective C 2.0引入了@optional和@required关键字。
  2. delegate是一种常用的设计模式,而不是Objective C或者Cocoa的feature,也没有任何关键字是给delegate用的。

    委托代理(degegate),顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。反映到程序中, 首先要明确一个对象的委托方是哪个对象,委托所做的内容是什么。委托机制在很多语言中都用到的,这只是个通用的思想,网上会有很多关于这方面的介绍。
  那么在苹果开发过程中,用到委托的程序实现思想如下,我主要拿如何在视图之间传输信息做个例子。譬如:在两个页面(UIIview视 图对象)实现传值,用委托(delegate)可以很好做到。


方法:
@interface A:UIView
id transparendValueDelegate;
@property(nomatic, retain) id transparendValueDelegate;
@end
@implemtion A
@synthesize transparendValueDelegate

-(void)Function

NSString* value = @"hello";
[transparendValueDelegate transparendValue: value];
}
@end

类B
@interface B:UIView
NSString* value;
@end
@implemtion B
-(void)transparendValue:(NSString*)fromValue
{
value = fromValue;
NSLog(@"the value is %@ ",value); 
}
@end



// 设置A代理委托对象为B
//在定义A和B类对象处:
A* a = [[A alloc] init];
B* b = [[B alloc] init];
a. transparendValueDelegate = b;//设置A代理委托对象为B
这样 在视图A和B之间可以通过委托来传值了。


第二个例子:


1.接口声明

#import <Foundation/Foundation.h>
//接口声明
@protocol ProtocolExampleDelegate <NSObject>
@required
-(void)successful:(BOOL)success;
@end

@interface ProtocolTest : NSObject{
//这个类包含该接口
id<ProtocolExampleDelegate> delegate;
}
//接口变量delegate作为类ProtocolTest的属性
@property(nonatomic,retain)id delegate;

//定义一个方法,使完成的时候回调接口
-(void)Complete;
@end

2.接口回调

#import "ProtocolTest.h"
@implementation ProtocolTest
@synthesize delegate;
-(void)complete
{
//回调接口,successful()由使用者负责具体实现
[[self delegate]successful:YES];
}

//通过定时器模拟在任务完成时调用接口回调函数
-(void)start
{
[NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(complete) userInfo:nil repeats:YES];
}
@end

3.接口实现

#import <UIKit/UIKit.h>
#import
"ProtocolTest.h"
@class Test;
@interface Test : NSObject<UIApplicationDelegate,ProtocolExampleDelegate>
{
UIWindow *window;
ProtocolTest *protocolTest;
}

@property(nonatomic,retain)UIWindow *window;
@end
#import "Test.h"
#import
"ProtocolTest.h"
@implementation Test
@synthesize window;
//只实现一个方法
-(void)successful:(BOOL)success
{
NSLog(@"completed");
}


这个例子只是理解下@protocol.



  评论这张
 
阅读(63)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017