【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的重要作用,页面的管理和切换. ...
随机推荐
- Java之创建对象>4.Enforce noninstantiability with a private constructor
如果你定义的类仅仅是包含了一些静态的方法和静态的字段,这些类一般是一些工具类,这些一般是设计为不能被实例化的. 1. Attempting to enforce noninstantiability ...
- 写了一个简单的Linux Shell用来下载文件
#!/bin/sh ; i<; i=i+ )); do # 利用spider来探测请求的资源是否存在,并把请求的结果写入到一个文件 wget --spider --http-user=usern ...
- Android实训案例(七)——四大组件之中的一个Service初步了解,实现通话录音功能,抽调接口
Service Service的奇妙之处.在于他不须要界面,一切的操作都在后台操作,所以非常多全局性(手机助手,语音助手)之类的应用非常长须要这个.我们今天也来玩玩 我们新建一个project--Se ...
- 全向轮运动学与V-rep中全向移动机器人仿真
Wheeled mobile robots may be classified in two major categories, omnidirectional and nonholonomic. O ...
- Debug 路漫漫-03
Debug 路漫漫-03:SVD++的 Matlab 版本 SVD++ 的 pu 这一项: 圈圈中的这一项,它既然要和pu 相加 的话 ,那么,它的维度也应该是 m*K.(就是维度和Pu一致的 . 而 ...
- 实现iOS序列化与反序列化(runtime)
一.变量声明 为便于下文讨论,提前创建父类Biology以及子类Person: Biology: @interface Biology : NSObject { NSInteger *_hairCou ...
- Quick Touch – 在 iOS 设备运行的 “Touch Bar”
关于 Quick Touch & Touch Bar Touch Bar 其实就是在原来 MBP 的按键区顶部新增了一个长条形的OLED触控屏,提供一些常用的快捷键.(iMessage 选表情 ...
- 【LeetCode】199. Binary Tree Right Side View
Binary Tree Right Side View Given a binary tree, imagine yourself standing on the right side of it, ...
- 在 Linux 平台中调试 C/C++ 内存泄漏方法(转)
由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误.同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的后果.本文将从静态分析和动态检测两 ...
- STDIN_FILENO的作用及与stdin 的区别
1.STDIN_FILENO的作用 STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用 ...