iOS代理之淺析(一)

借鑑了網絡資料,總結了下協議的做用以及用法。網絡

一、協議是一組通信協議,通常用做兩個類之間的通訊。ui

二、協議聲明瞭一組全部類對象均可以實現的接口。atom

三、協議不是類,用@protocol關鍵字聲明一個協議spa

四、與協議有關的兩個對象,代理者和委託者。.net

五、代理,實現協議的某個方法,至關於實現這個協議。代理

六、委託,用本身的方法,指定要實現協議方法的對象(代理),代理來實現對應的方法。對象

其中,兩個預編譯指令,@optional:表示能夠選擇實現的方法。接口

                  @required:表示強制執行的方法。字符串

貼一個小例子。get

協議: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 alloc] init];

    [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 alloc] init];

    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 (nonatomic, assign) id<MSCNodeAttributeSetterDelegate> AttributeSetDelegate;

//在這,只要引入這個接口,能夠做爲一個委託。其中引入接口也用<MSCNodeAttributeSetter>

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

//在委託設置代理類

@end

相關文章
相關標籤/搜索