iOS代理之浅析(一)

借鉴了网络资料,总结了下协议的作用以及用法。

1、协议是一组通讯协议,一般用作两个类之间的通信。

2、协议声明了一组所有类对象都可以实现的接口。

3、协议不是类,用@protocol关键字声明一个协议

4、与协议有关的两个对象,代理者和委托者。

5、代理,实现协议的某个方法,相当于实现这个协议。

6、委托,用自己的方法,指定要实现协议方法的对象(代理),代理来实现对应的方法。

其中,两个预编译指令,@optional:表示可以选择实现的方法。

                  @required:表示强制执行的方法。

贴一个小例子。

协议:SetStringDelegate

#import <Foundation/Foundation.h>

@protocol SetStringDelegate <NSObject>

- (NSString *)getString;

@end

委托类

RootViewController.h

#import <UIKit/UIKit.h>

#import "SetStringDelegate.h"

@interface RootViewController : UITabBarController

@property (nonatomic)id<SetStringDelegate>delegate;

@end

RootViewController.m

- (void)secondView

{

    SecondViewController * second = [[SecondViewController allocinit];

    [self.navigationController pushViewController:second animated:YES];

    [second release];

}

- (void)viewDidLoad

{

    [superviewDidLoad];

    UIBarButtonItem * rightItem = [[UIBarButtonItem alloc] initWithTitle:@"next"style:UIBarButtonItemStyleDone target:self action:@selector(secondView)];

    self.navigationItem.rightBarButtonItem = rightItem;

    [rightItem release];

    SecondViewController * second = [[SecondViewController allocinit];

    self.delegate = second;//指定代理对象为,second

    NSString * str = [self.delegate getString];//这里获得代理方法的返回值。

    [second release];

}

代理类

SecondViewController.h

#import <UIKit/UIKit.h>

#import "SetStringDelegate.h"

@interface SecondViewController : UITabBarController<SetStringDelegate>

@end

并在SecondViewController.m中实现代理方法

- (NSString *)getString

{

    return @"test";//返回一个test字符串。

}

一个简单的代理回调

也可以把代理对象设置为自身,可以在自身中实现协议方法。

这简单的两个类传值,可以用或不用代理,复杂的项目中,比如第三个类要得到协议方法的返回值。

用代理会比较方便。

其中项目中用到一个组合的概念,至今不太明白,代码先贴出来

#import <Foundation/Foundation.h>

#pragma mark -

#pragma mark delegate

//一个协议方法

@protocol MSCNodeAttributeSetterDelegate <NSObject]]>

- (void) reloadWithAttribute_Style;

@end

#pragma mark -

#pragma mark class

//提供一组接口,但是,又不是协议

@protocol MSCNodeAttributeSetter

@property (nonatomicassignid<MSCNodeAttributeSetterDelegate> AttributeSetDelegate;

//在这,只要引入这个接口,可以作为一个委托。其中引入接口也用<MSCNodeAttributeSetter>

- (void) setAttribute_Style:(NSString *)style;

//在委托设置代理类

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值