【IOS学习】之四、协议,委托,分类粗解
何为协议,何为委托,何为分类(类别)?
委托 即 代理 delegate:
- @interface A: UIView
- @property(nonatic, retain) id aValueDelegate;
- @end;
- @implementation A
- - (void) fa
- {
- NSString *value = @"hello";
- [aValueDelegate aValue:value];
- }
- @end;
- @interface B: UIView
- NSString *value;
- @end;
- @implementation B
- - (void) aValue:(NSString *)fromValue
- {
- value = fromValue;
- NSLog(@"%@", value);
- }
- @end;
- A *a = [[A alloc] init];
- B *b = [[B alloc] init];
- a.aValueDelegate = b; //设置a代理委托对象为b
- @interface NSString(NumberConvenience)
- -(NSNumber*) lengthAsNumber;
- @end
- @interface NSObject (***Delegate)
- //method
- @end
- //
- // Dog.h
- // protocol2
- //
- // Created by peter on 14-2-25.
- // Copyright (c) 2014年 peter. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- @interface Dog : NSObject
- @property int ID;
- @end
- @interface NSObject(myCategory)
- - (void)callFromNSObject;
- @end
- //
- // Dog.m
- // protocol2
- //
- // Created by peter on 14-2-25.
- // Copyright (c) 2014年 peter. All rights reserved.
- //
- #import "Dog.h"
- @implementation Dog
- - (id)init
- {
- self = [super init];
- return self;
- }
- @end
- @implementation NSObject(myCategory)
- - (void)callFromNSObject
- {
- NSLog(@"iam nsobject");
- }
- @end
- //
- // Person.h
- // protocol2
- //
- // Created by peter on 14-2-25.
- // Copyright (c) 2014年 peter. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Dog.h"
- @interface Person : NSObject
- //{
- // Dog *dog;
- //}
- @property Dog *dog;
- - (void)callFun;
- @end
- //
- // Person.m
- // protocol2
- //
- // Created by peter on 14-2-25.
- // Copyright (c) 2014年 peter. All rights reserved.
- //
- #import "Person.h"
- @implementation Person
- @synthesize dog;
- - (void) callFun
- {
- NSLog(@"Call Fun!");
- [dog callFromNSObject];
- }
- @end
- //
- // main.m
- // protocol2
- //
- // Created by peter on 14-2-25.
- // Copyright (c) 2014年 peter. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Dog.h"
- #import "Person.h"
- int main(int argc, const charchar * argv[])
- {
- @autoreleasepool {
- Dog *dog = [[Dog alloc]init];
- [dog setID:10];
- Person *qy = [[Person alloc]init];
- [qy setDog:dog];
- [qy callFun];
- }
- return 0;
- }
- @protocol NSCopying
- -(id) copyWithZone:(NSZone *) zone;
- @end
- @interface Car : NSObject<NSCopying>
- {
- // instance variable
- }
- // method
- @end // Car
2.协议不是类,它是定义了一个其他对象可以实现的接口
3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
5:委托,就是调用自己定义方法,别的类来实现。
6.新特性说明
@optional预编译指令:表示可以选择实现的方法
@required预编译指令:表示必须强制实现的方法
- @protocol myprotocol <NSObject>
- @optional
- -(void)print:(int)value;
- //可选的方法
- @required
- -(int)printValue:(int)value1 andValue:(int)value2;
- //必须实现的
- @end
- #import <Foundation/Foundation.h>
- #import "myprotocol.h"
- //实现协议 myprotocol
- @interface mytest : NSObject<myprotocol>
- - (void)showInfo;
- @end
- #import "mytest.h"
- @implementation mytest
- -(void)showInfo
- {
- NSLog(@"I am in showInfo");
- }
- //实现协议必须实现的
- -(int)printValue:(int)value1 andValue:(int)value2
- {
- NSLog(@"print value1 %d,value2 %d",value1,value2);
- return 0;
- }
- //实现可选的
- -(void)print:(int)value
- {
- NSLog(@"print value is %d",value);
- }
- @end
- #import <Foundation/Foundation.h>
- #import "mytest.h"
- #import "myprotocol.h"
- int main (int argc, const charchar * argv[]) {
- @autoreleasepool {
- mytest *test=[[mytest alloc]init];
- [test showInfo];
- [test printValue:20 andValue:30];
- //print协议是可选的,所以在用之前一定要判断是否实现了,不然可能会出错,使用下面的方法
- // [test print:20];
- SEL sel=@selector(print:);
- if([test respondsToSelector:sel]){
- [test print:11];
- }
- //用协议的方式实现
- id<myprotocol> protocol =[[[mytest alloc]init]autorelease];
- [protocol showInfo];
- [protocol printValue:200 andValue:300];
- if([protocol respondsToSelector:@selector(print:)]){
- [protocol print:111];
- }
- }
- return 0;
- }
- //
- // Dog.h
- // catagory
- //
- // Created by peter on 14-2-25.
- // Copyright (c) 2014年 peter. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- @protocol dogBark;
- @interface Dog : NSObject
- {
- int barkCount;
- NSTimer *timer;
- }
- @property int ID;
- @property (assign)id<dogBark> delegate; //dog master
- @end
- @protocol dogBark <NSObject>
- - (void)bark: (Dog*)thisDog count:(int)count;
- @end
- //
- // Dog.m
- // catagory
- //
- // Created by peter on 14-2-25.
- // Copyright (c) 2014年 peter. All rights reserved.
- //
- #import "Dog.h"
- @implementation Dog
- //ID use _ID
- @synthesize delegate;
- - (id)init
- {
- if (self = [super init]) {
- //create nstimer user, 1.0s use updateTimer:nil
- timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];
- }
- return self;
- }
- - (void) updateTimer:(id)arg
- {
- barkCount++;
- NSLog(@"dog bar %d", barkCount);
- //user master delegate bark:count
- [delegate bark:self count:barkCount];
- }
- @end
- //
- // person.h
- // catagory
- //
- // Created by peter on 14-2-25.
- // Copyright (c) 2014年 peter. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Dog.h"
- @interface person : NSObject<dogBark>
- {
- Dog *_dog;
- }
- @property (retain, nonatomic) Dog *dog;
- @end
- //
- // person.m
- // catagory
- //
- // Created by peter on 14-2-25.
- // Copyright (c) 2014年 peter. All rights reserved.
- //
- #import "person.h"
- @implementation person
- - (void)setDog:(Dog *)aDog
- {
- if (_dog != aDog) {
- [_dog setDelegate:self];
- }
- }
- //dog use person interface
- - (void)bark:(Dog *)thisDog count:(int)count
- {
- NSLog(@"person bark: this dog %d bark %d", [thisDog ID], count);
- }
- @end
- //
- // main.m
- // catagory
- //
- // Created by peter on 14-2-25.
- // Copyright (c) 2014年 peter. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Dog.h"
- #import "person.h"
- int main(int argc, const charchar * argv[])
- {
- @autoreleasepool {
- person *qy = [[person alloc]init];
- Dog *dog = [[Dog alloc]init];
- [dog setID:10];
- [qy setDog:dog];
- while (1) {
- [[NSRunLoop currentRunLoop]run];
- }
- }
- return 0;
- }
解释一下循环:
【IOS学习】之四、协议,委托,分类粗解的更多相关文章
- iOS学习——(转)UIResponder详解
本文转载自:ios开发 之 UIResponder详解 我们知道UIResponder是所有视图View的基类,在iOS中UIResponder类是专门用来响应用户的操作处理各种事件的,包括触摸事件( ...
- iOS学习——(转)NSObject详解
本文主要转载自:ios开发 之 NSObject详解 NSObject是大部分Objective-C类继承体系的根类.这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject ...
- iOS学习——iOS项目Project 和 Targets配置详解
最近开始学习完整iOS项目的开发流程和思路,在实际的项目开发过程中,我们通常需要对项目代码和资料进行版本控制和管理,一般比较常用的SVN或者Github进行代码版本控制和项目管理.我们iOS项目的开发 ...
- iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem
http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINavigati ...
- [转]iOS学习之UINavigationController详解与使用(三)ToolBar
转载地址:http://blog.csdn.net/totogo2010/article/details/7682641 iOS学习之UINavigationController详解与使用(二)页面切 ...
- [转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController
转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加U ...
- IOS中类的扩展(协议,分类)
IOS中类的扩展(协议,分类) 扩展类,我们可以使用协议和分类这两种方法,下面我们来分别实现这两种方法: 参考网址:http://www.cnblogs.com/wendingding/p/37095 ...
- iOS学习之UINavigationController详解与使用(三)ToolBar
1.显示Toolbar 在RootViewController.m的- (void)viewDidLoad方法中添加代码,这样Toobar就显示出来了. [cpp] view plaincopy [ ...
- iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController
iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem是上篇,我们接着讲UINavigationController的重要作用,页面的管理和切换. ...
随机推荐
- cocos2d-js Shader系列4:Shader、GLProgram在jsb(native、手机)和html5之间的兼容问题。cocos2d-js框架各种坑。
为了让jsb也能顺利跑起滤镜效果,在手机侧折腾了2天,因为每次在真机上运行总要耗那么半分钟,而且偶尔还遇到apk文件无法删除导致运行失败的情况. 这个调试起来,实在让人烦躁加沮丧. 还好,测试上百轮, ...
- 解码url参数的lotusscript函数
在Domino的系统开发过程中,我们往往要通过url来进行传参,传递参数给表单或者代理,假如浏览器请求的url带有参数,在交给服务器前服务器会对其进行编码(不知道这样理解对不对),像一些特殊符号,空格 ...
- jenkins 搭建过程中遇到的问题
1.[ERROR] Unknown lifecycle phase "mvn". You must specify a valid lifecycle phase or a goa ...
- shell脚本npm构建静态文件
#!/bin/bash cd /data/web source /etc/profile /usr/bin/cnpm i && npm run build cp -r ./dist/* ...
- Safari导入书签
1.打开Safari 这边safari会自动带出一些关联的浏览器,但如果你要导入的浏览器不在这里的话,就需要看第二步. 2.比如,这里我要从QQ浏览器导入,先打开QQ浏览器. 其他浏览器都类似,找到书 ...
- WordPress固定链接修改后访问文章页面404
如题, 修改固定链接为自定义结构后, 访问文章页面出现404的nginx错误. 解决:修改nginx.conf配置文件(/usr/local/nginx/conf/nginx.conf). 在serv ...
- 让硬盘灯不再狂闪,调整Win7系统绝技(转)
让硬盘灯不再狂闪,调整Win7系统绝技! Win7对硬盘的大量读写确实令人头疼,Win7虽然快,但这是以损耗我们的硬件作为代价的,特别是Win7系统中内置的几种系统服务,对普通用户没有多大的用处,但是 ...
- LATeX 插入脚注
LATeX 插入脚注: 使用 \footnote{...注释内容} 命令: To maximize the lower-bound $ we employ conjugate gradient me ...
- 实现外卖选餐时两级 tableView 联动效果
最近实现了下饿了么中选餐时两级tableView联动效果,先上效果图,大家感受一下: 下面说下具体实现步骤: 首先分解一下,实现这个需求主要是两点,一是点击左边tableView,同时滚动右边tabl ...
- FireFox 浏览器插件/扩展开发学习
2014-11-08 内容存档在evernote,笔记名"FireFox 浏览器插件/扩展开发学习"