OC中协议Protocol的小结

//协议的基础语法

//遵从协议的类,可以声明出遵从协议的对象

Dog * dog = [[Dog
alloc] init];

//普通id指针能指向任何对象,带协议的id只能指向遵从协议的类的对象

//Dog类遵从了MyProtocol协议,实现了协议中的方法

id <MyProtocol> obj = dog;

//obj可以使用协议中定义的方法bark

[obj
bark];

//
//  main.m
//  协议1-基础语法
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Dog.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        //协议的基础语法
        //遵从协议的类,可以声明出遵从协议的对象
        Dog * dog = [[Dog alloc] init];
        //普通id指针能指向任何对象,带协议的id只能指向遵从协议的类的对象
        //Dog类遵从了MyProtocol协议,实现了协议中的方法
        id <MyProtocol> obj = dog;
        //obj可以使用协议中定义的方法bark
        [obj bark];
        [dog release];

    }
    return 0;
}
//
//  Protocol.h
//  协议-1
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol MyProtocol <NSObject>
//协议是可以继承的  Protocol协议继承了NSObject协议
//遵从了Protocol协议就同时遵从了NSObject协议

//在协议中声明方法,凡是遵从(conform)协议的类会出卖相同接口的方法
-(void)bark;

@end
//
//  Dog.h
//  协议-1
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "MyProtocol.h"

@interface Dog : NSObject <MyProtocol>
//Dog类遵从协议,出卖协议上的方法

-(void)bark;//叫 (出卖)
-(void)run;

@end
//
//  Dog.m
//  协议-1
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import "Dog.h"

@implementation Dog

-(void)bark
{
    NSLog(@"Won!");
}

-(void)run
{
    NSLog(@"Run");
}

@end

//用协议实现代理

//Boss要调用Worker中的方法(Boss—>Worker)

//协议可以单独文件定义,也可以定义在委托方的声明文件中(.h)

//协议中定义了方法buyMac

//Boss中有个带协议的id型属性delegate,delegate就可以使用buyMac,但不用实现

Boss * mars = [[Boss
alloc] init];

//老王遵从协议,并实现协议中声明的方法buyMac

Worker * laowang = [[Worker
alloc] init];

//把Boss中delegate指向Worker变量

mars.delegate = laowang;

//相当于: id<BossDelegate> delegate = laowang;

[mars delegateBuyMac];

// 相当于: [delegate buyMac];

//
//  main.m
//  协议2-实现代理
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Boss.h"
#import "Worker.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //用协议实现代理
        //协议可以单独文件定义,也可以定义在委托方的声明文件中(.h)
        //协议中定义了方法buyMac
        //Boss中有个带协议的id型属性delegate,delegate就可以使用buyMac,但不用实现
        Boss * mars = [[Boss alloc] init];
        //老王遵从协议,并实现协议中声明的方法buyMac
        Worker * laowang = [[Worker alloc] init];
        //把Boss中delegate指向Worker变量
        mars.delegate = laowang;
        //相当于: id<BossDelegate> delegate = laowang;
        [mars delegateBuyMac];
        // 相当于: [delegate buyMac];

        [mars release];
        [laowang release];

    }
    return 0;
}
//
//  Boss.h
//  协议2-实现代理
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>

//协议可以声明于委托方的头文件中
@protocol BossDelegate <NSObject>

//协议中规定 被委托的方法 买MAC
- (void)buyMac;

@end

@interface Boss : NSObject

//指向代理的指针,若引用(assign)
@property (assign) id <BossDelegate> delegate;

//委托代理替自己买MAC
-(void)delegateBuyMac;

@end
//
//  Boss.m
//  协议2-实现代理
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import "Boss.h"

@implementation Boss

//委托代理替自己买MAC
-(void)delegateBuyMac
{
    //代理指针指向worker
    [self.delegate buyMac];
    //id指针调用协议上的方法
}

@end
//
//  Worker.h
//  协议2-实现代理
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Boss.h"

@interface Worker : NSObject <BossDelegate>
//worker遵从协议,出卖了协议上的方法 即买MAC的方法

//采购MAC
//- (void)buyMac;
@end
//
//  Worker.m
//  协议2-实现代理
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import "Worker.h"

@implementation Worker
//采购MAC
- (void)buyMac
{
    NSLog(@"Worker采购了一批MAC!");
}
@end

//用协议实现传值

//Worker要传送数据给Boss(Worker-->Boss)

//协议中定义了方法numOfMacBooksRise:(NSUInteger)rise;rise是要传送的数据

//Worker中有个带协议的id型属性delegate,delegate可以调用numOfMacBooksRise:方法

Worker * laowang = [[Worker
alloc] init];

//Boss实现协议中的方法

Boss * mars = [[Boss
alloc] init];

//把Worker中的delegate属性指向Boss

laowang.delegate = mars;

//Worker自定义方法中调用协议中的方法,则Boss实现协议中的方法时,就可以获得Worker传过来的值

[laowang sendMacForNumber:13];

//
//  main.m
//  协议3-传值
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Worker.h"
#import "Boss.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        //用协议实现传值
        //Worker要传送数据给Boss(Worker-->Boss)
        //协议中定义了方法numOfMacBooksRise:(NSUInteger)rise;rise是要传送的数据
        //Worker中有个带协议的id型属性delegate,delegate可以调用numOfMacBooksRise:方法
        Worker * laowang = [[Worker alloc] init];
        //Boss实现协议中的方法
        Boss * mars = [[Boss alloc] init];
        //把Worker中的delegate属性指向Boss
        laowang.delegate = mars;
        //Worker自定义方法中调用协议中的方法,则Boss实现协议中的方法时,就可以获得Worker传过来的值
        [laowang sendMacForNumber:13];

        [mars release];
        [laowang release];

    }
    return 0;
}
//
//  Boss.h
//  协议3-传值
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Worker.h"

@interface Boss : NSObject <WorkerDelegate>
{
    //Mac总数
    NSUInteger _numOfMacBooks;
}

//自带增长本的个数
- (void) numOfMacBooksRise:(NSUInteger)rise;//被动
@end
//
//  Boss.m
//  协议3-传值
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import "Boss.h"

@implementation Boss
//自带增长本的个数
- (void) numOfMacBooksRise:(NSUInteger)rise
{
    _numOfMacBooks += rise;
    NSLog(@"Mars的本增长了%lu, 共有%lu", rise, _numOfMacBooks);
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        _numOfMacBooks = 0;
    }
    return self;
}

@end
//
//  Worker.h
//  协议3-传值
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol WorkerDelegate <NSObject>

- (void)numOfMacBooksRise: (NSUInteger)rise;

@end

@interface Worker : NSObject

@property (assign) id<WorkerDelegate> delegate;

//发送一定量的本
-(void)sendMacForNumber:(NSUInteger)num;

@end
//
//  Worker.m
//  协议3-传值
//2
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import "Worker.h"

@implementation Worker
//发送一定量的本
-(void)sendMacForNumber:(NSUInteger)num
{
    NSLog(@"老王发送了Mac%lu台", num);
    [self.delegate numOfMacBooksRise:num];
}
@end

//协议实现回调

//MHRequest类中定义了协议MHRequestDelegate,并有一个遵从协议的id型属性delegate

//此外MHRequest中还有一个开辟线程启动下载的方法,下载完毕后会调用协议中的方法

//DataManaget类中有一个MHRequest的成员对象_request,_request的delegate指向DataManager自身

//当DataManager需要下载数据时,就调用_request中的下载方法

//同时DataManger还实现了协议中的方法,从协议中的方法中可以获得下载的数据

//再添加一个方法和属性就可以返回下载的数据

DataManager * dm = [[DataManager
alloc]
init];

[dm downloadDataWithURL:@"http://blog.csdn.net/macro_13/"];

sleep(20);//下载需要时间,故需要延时

NSString * ret = [dm
returnContent];

NSLog(@"这是下载的数据:\n%@", ret);

[dm release];

//
//  main.m
//  协议4-回调
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "DataManager.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {

//协议实现回调
//MHRequest类中定义了协议MHRequestDelegate,并有一个遵从协议的id型属性delegate
//此外MHRequest中还有一个开辟线程启动下载的方法,下载完毕后会调用协议中的方法

//DataManaget类中有一个MHRequest的成员对象_request,_request的delegate指向DataManager自身
//当DataManager需要下载数据时,就调用_request中的下载方法
//同时DataManger还实现了协议中的方法,从协议中的方法中可以获得下载的数据
//再添加一个方法和属性就可以返回下载的数据

DataManager * dm = [[DataManager alloc] init];
[dm downloadDataWithURL:@"http://blog.csdn.net/macro_13/"];
sleep(20);//下载需要时间,故需要延时
NSString * ret = [dm returnContent];
NSLog(@"这是下载的数据:\n%@", ret);
[dm release];

    }
    return 0;
}
//
//  DataManager.h
//  协议4-回调
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "MHRequest.h"

@interface DataManager : NSObject <MHRequestDelegate>

@property (copy) NSString * content;

-(void) downloadDataWithURL:(NSString *)url;

- (NSString *)returnContent;

@end
//
//  DataManager.m
//  协议4-回调
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import "DataManager.h"
#import "MHRequest.h"

@implementation DataManager
{
    MHRequest * _request;

}

-(instancetype) init
{
    if (self = [super init]) {
        _request = [[MHRequest alloc] init];
        _request.delegate = self;

    }

    return self;
}

-(void)dealloc
{
    [_request release];

    self.content = nil;
    [super dealloc];
}

-(void) downloadDataWithURL:(NSString *)url
{
    //dataManager不会下载,可以通过自己的成员替自己下载
    [_request requestForURL:url];
    //如果这个方法中不开线程,那么这个方法返回时就是下载完成的时候
    //开线程,只要线程一开,主线程继续执行,这个方法返回时也不一定下载完毕
}

//数据下载完成后会自动调用这个函数
-(void)requestDidFinished:(NSData *)data
{
    //data就是下载到的数据
    //dataManager可以将下一步操作写在这里
    //解析数据
    NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//    NSLog(@"下载到数据:\n%@", str);
    self.content = str;
    [str release];
//    NSLog(@"%@", self.content);
    NSLog(@"数据下载完成");
}

- (NSString *)returnContent
{
    return self.content;
}

@end
//
//  MHRequest.h
//  协议4-回调
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol MHRequestDelegate <NSObject>

- (void)requestDidFinished:(NSData *)data;

@end

/**请求类,其对象用于开辟线程异步下载数据*/
@interface MHRequest : NSObject

@property (assign) id <MHRequestDelegate> delegate;

//本地或者远程数据资源
-(void)requestForURL:(NSString *)url;

@end
//
//  MHRequest.m
//  协议4-回调
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import "MHRequest.h"

@implementation MHRequest

-(void)requestForURL:(NSString *)url
{
    //开一个子线程下载数据
    NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:url];
    //让子线程执行
    [thread start];
}

- (void)download:(NSString *)url
{
    NSData * data  = [NSData dataWithContentsOfURL: [NSURL URLWithString:url]];

    sleep(arc4random() % 5 + 5);

    [self.delegate requestDidFinished:data];
}

@end

//协议实现多继承

//
//  main.m
//  协议5-多继承
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "IOSStudent.h"
#import "AndroidStudent.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSMutableArray * array = [[NSMutableArray alloc] init];
        Class classArray[] = {[IOSStudent class],[AndroidStudent class]};

        NSArray * names = @[@"Kitty", @"Alice", @"Ferry", @"Alen", @"Merry", @"Ben"];

        for (NSInteger i = 0 ; i < [names count]; i++) {
            id obj = [[classArray[arc4random() % 2] alloc] init];//随机定义对象

            [obj setName:names[i]];//设置name
            [obj setAge:arc4random() % 20 + 10];//随机设置年龄

            [array addObject:obj];
            [obj release];
        }
        //根据年龄将学生排序,注:array中是不同类的对象
        [array sortUsingSelector:@selector(youngerThanStudent:)];

        for (id  stu in array) {
            NSLog(@"%@", stu);
        }

        [array release];

    }
    return 0;
}
//
//  StuProtocol.h
//  协议5-多继承
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol StuProtocol <NSObject>

@property NSUInteger age;

- (BOOL)youngerThanStudent:(id <StuProtocol>)stu;

@end
//
//  Student.h
//  协议5-多继承
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Student : NSObject

@property NSUInteger age;

- (BOOL)youngerThanStudent:(Student *)stu;

@end
//
//  Student.m
//  协议5-多继承
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import "Student.h"

@implementation Student

- (BOOL)youngerThanStudent:(Student *)stu
{
    return self.age < stu.age;
}

@end
//
//  AndroidStudent.h
//  协议5-多继承
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "StuProtocol.h"
#import "Student.h"

@interface AndroidStudent : Student <StuProtocol>

@property (copy) NSString * name;
//@property NSUInteger age;

@end
//
//  AndroidStudent.m
//  协议5-多继承
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import "AndroidStudent.h"

@implementation AndroidStudent

- (void)dealloc
{
    self.name = nil;
    [super dealloc];
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"方向:Android 姓名:%@ 年龄:%lu", self.name, self.age];
}

//- (BOOL)youngerThanStudent:(id<StuProtocol>)stu
//{
//    return self.age < stu.age;
//}

@end
//
//  IOSStudent.h
//  协议5-多继承
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "StuProtocol.h"
#import "Student.h"

@interface IOSStudent : Student <StuProtocol>

@property (copy) NSString * name;
//@property NSUInteger age;

@end
//
//  IOSStudent.m
//  协议5-多继承
//
//  Created by Macro on 14-12-12.
//  Copyright (c) 2014年 Macro. All rights reserved.
//

#import "IOSStudent.h"

@implementation IOSStudent

- (void)dealloc
{
    self.name = nil;
    [super dealloc];
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"方向:IOS 姓名:%@ 年龄:%lu", self.name, self.age];
}

//- (BOOL)youngerThanStudent:(id<StuProtocol>)stu
//{
//    return self.age < stu.age;
//}

@end
时间: 2024-10-04 11:23:20

OC中协议Protocol的小结的相关文章

OC中协议的概念以及用法

OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的.协议就是定义了一组方法,然后让其他类去实现 下面来看代码:WithProtocol.h[objc]  view plaincopy 

OC中协议, 类目, 时间, 延展, 属性

必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @property (nonatomic, assign) id<marryprotocol> husband; 避免Optitonal没有实现的功能 if ([_husband respondsToSelector:@selector(driver)]) { [_husband driver]; } @required//必须实现的协议, 默认协议 - (void)s

关于oc中自动引用计数 小结

1.自动引用计数 ARC(Automatic Reference Counting,自动引用计数)极大地减少了Cocoa开发中的常见编程错误:retain跟release不匹配.ARC并不会消除对retain和release的调用,而是把这项原本大都属于开发者的工作移交给了编译器.这样做的好处是显而易见的,但是必须知道retain和release是仍然在使用的.ARC并不等同垃圾回收.(有利于程序员操作) 2. 手动引用计数和自动引用计数区别 在手动计数中可以使用retain和release但在

黑马程序员------OC中协议和分类

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- OC中没有想C++中的多继承,是利用分类和协议来实现的. 分类是在不影响原有存在类的基础上,为原有类添加属性和方法. 协议:一般只是声明方法.遵守了协议的类,才会去实现协议中的方法. 协议一般和代理的一起使用.分类,一般是为系统中的类添加

OC中的protocol

一. 简单使用 1. 基本用途 可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守了 2. 格式 协议的编写 @protocol 协议名称 // 方法声明列表 @end 某个类遵守协议 @interface 类名 : 父类 <协议名称> @end 3. 关键字 协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流 @required:这个

OC中协议、代理

Boss类的声明文件 #import <Foundation/Foundation.h> @protocol BossDelegate -(void)bookTicket;//预定机票 -(void)bookRoom;//预定房间 -(void)notify;//开会 @end @interface Boss : NSObject @property(nonatomic,weak)id<BossDelegate>delegate; -(void)travel;//旅行 -(void

OC基础--分类(category) 和 协议(protocol)

OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低,导致了分类文件和协议文件没有找到,最后百度得知: 如图:Xcode 7.2版本中的category文件和protocol文件都归类到了Objective-C File 中   一.category文件: 作用:可以扩展自定义类,或者系统类.下面的实例,是扩展了NSString 类,在类中扩展了计算字

OC语言--协议

1.协议的介绍 1.1什么是协议 协议就是需要相互遵守的约定.规范.比如卖身协议,我们负责给Boss写代码,调bug,发布,Boss负责给我们发薪水,保险,福利:比如Http协议,两台计算机,遵守相同的约定,可以相互通讯.就像我们彼此交流,都遵守说中文这个约定或规范. 2. OC中协议 2.1OC协议概念 OC或IOS中的协议,就是一组方法(成员函数)的声明列表:声明方不需要实现这些方法,由遵守协议的对象来实现协议所规定的方法.(制定法律规范,让别人遵守). 2.2OC协议的使用步骤 制定协议

【iOS】Swift中扩展extension与协议protocol

一起连带前面几篇Playground小结代码都转到github上了,注释写了很多,主要方便自己以后可以翻翻看.Swift语法主要部分差不多就这些了.当然还有泛型.运算符重载.ARC.闭包之类的补充. 一.扩展(extension) 扩展 extension(类似OC中的分类,但Swift中没有名字), 即使在没有权限获取到原始代码的情况下,为类增加新功能. 注意: 只要定义了扩展, 那么该扩展对该类的实例都是可用的. extension SomeType{ //添加到SomeType的新功能写在