协议和委托

来源:互联网 发布:南苑机场 知乎 编辑:程序博客网 时间:2024/05/16 18:16

Objective-C语法讲座(重要)

http://www.cocoachina.com/newbie/basic/2011/1026/3422.html




网络编程从大的方面说就是对信息的发送到接收。       自定义协议实现网络通信 

网络编程的主要对象就是浏览器 因为我们上网基本上是依赖浏览器的,当然,像游戏,聊天软件等等这些不依赖浏览器,但需要网络协议,不同的协议,有不同的功能,网络编程就是做这些,浏览器:一大堆接口给你摆这了,想做成什么样?自己实现去吧。网络协议:这个跟前面的差不多也有一些接口,或者服务条款等等(嘿嘿,还没研究那么深)然后还是要我们编程人员来实现,我们可以从以上信息中得到它们运行的机制,特点,模式,语言,服务规定等等信息,熟知这些后,我们就可以编程了,利用它自身的东西,在加上我们需要而且符合它规范,且可运行的东西,就是编出来的东西啦~这个就是网络编程啦。 
API函数,就是指系统提供的函数。协议定义:计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。为实现网络数据交换而建立的规则、约定或标准就称为网络协议。目前较为流行的网络编程模型是客户机/服务器(C/S)结构。网络协议对于需要从事网络编程的程序员来说,网络协议是一个需要深刻理解的概念。协议格式就是服务器端反馈的数据格式。网络协议就是一种格式上的约定,可以根据逻辑的需要约定出各种数据格式,在进行设计时一般遵循“简单、通用、容易解析”的原则进行。不管怎么说,在网络编程中,对于同一个网络程序来说,一般都会涉及到两个网络协议格式:客户端发送数据格式和服务器端反馈数据格式,在实际设计时,需要一一对应。这就是最基本的网络协议的知识。网络协议是指对于网络中传输的数据格式的规定。网络编程中用到数据交互。
 
什么叫API?API是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而

又无需访问源码,或理解内部工作机制的细节。




iphone开发中,自定义协议有什么用?
iphone开发中,自定义协议
自定义协议语法如下:
@protocol   协议名称
方法之声明
@end

Objective-C2.0中协议的新特性:(1)@optional预编译指令:表示可以选择实现的方法(2)@required预编译指令:表示必须强制实现的方法
例如:
@protocol FrameworkDelegate <NSObject>
@optional   //可选的(正式协议) 有这个做标志
-(void)didReceiveCM:(Framework*)framework ChatMessage:(ChatMessage*)cm;
-(void)QUserArrived:(Framework*)framework AddressBook:(NSMutableArray*)ab;
//如果@optional 放在此处,表示上面2个方法内部必须实现,下面2个方法可选
-(void)AllUserArrived:(Framework*)framework AddressBook:(NSMutableArray*)ab;
-(void)ConversationListChanged:(Framework*)framework ConversationList:(NSMutableArray*)cl;
@end





objective-c 协议和委托 (重点基础知识)
objective-c protocol delegate
protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。 
delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。
当一个A view 里面包含了B view
b view需要修改a view界面,那么这个时候就需要用到委托了。
需要几个步骤
1。首先定一个协议
2。a view实现协议中的方法
3。b view设置一个委托变量
4。把b view的委托变量设置成a view,意思就是 ,b view委托a view办事情。
5。事件发生后,用委托变量调用a view中的协议方法
例子:
B_View.h:
@protocol UIBViewDelegate <NSObject>

@optional
- (void)ontouch:(UIScrollView *)scrollView; //声明协议方法
@end
@interface BView : UIScrollView<UIScrollViewDelegate> 
{
 id< UIBViewDelegate > _touchdelegate; //设置委托变量
}
@property(nonatomic,assign) id< UIBViewDelegate > _touchdelegate; 
@end
B_View.mm:
@synthesize _touchdelegate;
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
 // Initialization code
 _touchdelegate=nil;
 }
 return self;
}
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
 [super touchesBegan:touches withEvent:event];

 if(_touchdelegate!=nil && [_touchdelegate respondsToSelector: @selector(ontouch:) ] == true) 

  [_touchdelegate ontouch:self];  //调用协议委托
}
@end
A_View.h:
@interface AViewController : UIViewController < UIBViewDelegate >

{
 BView *m_BView;
}
@end

A_View.mm:

- (void)viewWillAppear:(BOOL)animated
{
 m_BView._touchdelegate = self; //设置委托
 [self.view addSubview: m_BView];

}

- (void)ontouch:(UIScrollView *)scrollView
{
    //实现协议
}





iPhone的Delegate自定义(非常重要的基础语法知识)
delegate(委托)是iPhone开发中一个非常重要的知识点,本人感觉类似c语言的callback(回调函数)或是java中的Interface(接口)。
在Iphone开发中我们大量用到delegate,无论是视图、控件等等,我们也可以自己定义delegate,以下介绍自定义delegate的步骤
1.定义delegate的protocol文件
在一般的头文件h文件中添加如下内容
@protocol MainViewDelegate
@required
-(void)settingsButtonTapped;
-(void)bookmarksButtonTapped;
@optional -(void)rewind;
-(void)fastForward;
@end
protocl 后的MainViewDelegate则为delegate名,以后类都需要引用该名字
其中required标识其下面的函数定义为必须函数,类似c++中如果我们定义了纯需函数,则其子类必须定义纯虚函数内容。
而option则标识其下面的函数为可选函数,类似c++开发中的虚函数,其子类无需一定要定义虚函数的内容
2.在实际使用的类的头文件中定义
@interface MainViewController : UIViewController

SREngine* _engine;
MainView* _contentView;
SettingsViewController* _settingsViewController;

在类定义中使用“<>”符号作为deleate的名字,每个类可以引用多个类,类似java可以继承多个接口
3.最后在类的实现文件中定义该delegate中必须定义的函数内容
@implementation -(void)settingsButtonTapped {
.. .
}
-(void)bookmarksButtonTapped {
.. . .. .
}





Delegate算是Objective-C的一大特性, 我们用Delegate很多情况下是基于多线程的,比如我们有一个ViewController在这个Controller里面进行了一个下载图片 的操作,下载成功后需要通过protocol来现实下载成功, 但是当ViewController已经被release,而下载工作才结束,  那么下载工作的[delegate didFinishDownload] (暂且就这么命名吧)  就会产生一个异常,因为你给一个deallocated的对象发送了一个消息. 




类别允许你在现有的类中加入新功能,这些类可以是框架中的类,并且不需要扩充它
1.声明类别
@interface NSString (NumberConvenience)
-(NSNumber *) lengthAsNumber;
@end
该声明表示,类别的名称是NumberConvenience,而且该类别将向NSString类中添加方法。
2.实现类别
@implementation NSString (NumberConvenience)
-(NSNumber *) lengthAsNumber
{
unsigned int length = [self length];
return ([NSNumber numberWithUnsignedInt: length]);

}
@end

3.局限性
类别有两方面的局限性。第一,无法向类中添加新的实例变量。类别没有位置容纳实例变量二,名称冲突,即类别中的方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。这点可以通过增加一个前缀的方法解决。
4.非正式协议和委托类别
实现委托除了第七节中应用协议的方式,还可以使用类别。具体做法就是把委托对象要实现的方法声明为一个NSObject的类别。如下面的代码所示:
@interface NSObject(NSSomeDelegateMethods)
-(void)someMethod;

@end
通过将这些方法声明为NSObject的类别,使得只要对象实现了委托方法,任何类的对象都可以成为委托对象。创建一个NSObject的类别称为“创建一个非正式协议”。非正式协议只是一种表达方式,它表示“这里有一些你可能想实现的方法”,第六节介绍的协议可以叫做正式协议。
非正式协议的作用类似于使用许多@optional的正式协议,并且前者正逐渐被后者所代替。
5.选择器
选择器只是一个方法名称,它以ObjC运行时使用的特殊方式编码,以快速执行查询。你可以使用@selector()预编译指令指定选择器,其中方法名位于圆括号中。如一个类中setEngine:方法的选择器是:@selector(setEngine:)。
因为选择器可以被传递,可以作为方法的参数使用,甚至可以作为实例变量存储。这样可以生成一些非常强大和灵活的构造。





类目(Category):
类目是Objective-C中最有用的一个特性。实质上,类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的实现细节。
这是特别有用的,因为你可以给一个内建的对象添加方法。当你想在你的应用程序里面给所有NSString类型的实例添加一个方法,你只需要添加一个类目,而不需要通过定义一个子类来添加该方法。
比如,我想给NSString添加一个方法以判断它是不是一个URL,写法就像这样:
#import <Cocoa/Cocoa.h>
@interface NSString 
(Utilities)
- (BOOL) isURL;
@end
这很像一个类的声明。不同的地方在于后面没有列出父类,并且在括号里面写了类目的名称。类目的名字可以随便取,但是最好能表达出你在类目中包含的方法所要做的事。
下面是一个实现。切记,这不是很好的检查URL的方法。我们只是为了说清楚类目的概念。
#import "NSString-Utilities.h"
@implementation NSString 
(Utilities)
- (BOOL) isURL
{
    if ( [self hasPrefix:@"http://"] )
        return YES;
    else
        return NO;
}
@end
现在,你可以使用NSString的这个方法了,下面的代码会在控制台打印“string1 is a URL”:
NSString* string1 = @"http://pixar.com/";
NSString* string2 = @"Pixar";
if ( [string1 isURL] )
    NSLog (@"string1 is a URL");
if ( [string2 isURL] )
    NSLog (@"string2 is a URL");


与子类不同,你不能通过类目来添加实例变量。但是你能通过类目重写(override)类中已经存在的方法,当然,重写的时候要特别小心。
记住,当你通过类目更改一个类的时候,这个更改会影响你这个应用程序中所有这个类的实例。

0 0
原创粉丝点击