1. 程式人生 > >iOS類與類之間的三種傳值方式

iOS類與類之間的三種傳值方式

一代理方式

什麼是代理模式

傳入的物件,代替當前類完成了某一個功能,稱為代理模式.

實現代理有以下方法

在要傳值的類中

1> 宣告代理方法

2> 定義代理屬性

3> 在適當的時候呼叫代理方法

在要接受值的類中

1> 設定代理物件

2> 遵守代理協議

3> 實現代理方法

圖片如下:
image
程式碼如下

B.H類  類名  name
///宣告代理方法
@protocol  nameDelegate <NSObject>

- (void)name:(B *)VC ;

@end

///定義代理屬性
@property (nonatomic
, weak) id<nameDelegate> delegate; B.M ///在合適的時候呼叫代理方法 if ([self.delegate respondsToSelector:@selector(a:)]) { [self.delegate a:self]; } A.M ///設定代理物件,獲取B B *b = [[B alloc]init]; b.delegate = self; ///遵守代理協議 @interface contactController ()<nameDelegate> ///實現代理方法 - (void)name:(B *)VC { }

BLOCK傳值

什麼是BLOCK

蘋果推薦的型別,效率高,在執行中儲存程式碼。用來封裝和儲存程式碼,有點像函式,BLOCK可以在任何時候執行。

BOLCK和函式的相似性:

(1)可以儲存程式碼(2)有返回值(3)有形參(4)呼叫方式一樣

///block如何寫
block資料型別
定義格式:
返回值型別(^block變數名)(形參列表)=^(形參列表){
}

呼叫block
block變數名(實參);
預設情況下,Block內部不能修改外面區域性變數
Block內部可以修改使用__block修飾的區域性變數

使用typedef定義Block型別
typedef 返回值型別(^block
型別名稱)(形參列表)

圖片如下

image
程式碼如下

B.H
///宣告一個block屬性
typedef void(^MyBlock) (NSString *);

///定義一個block屬性
@property (copy ,nonatomic)MyBlock Block;

@property (copy, nonatomic) NSString *name;

B.M
///在適當的時候呼叫Block
    if (self.MyBlock) {
        self.MyBlock(name);
    }
A.M
///儲存一個程式碼塊
/ / /獲取B
 B.MyBlock = ^(NSString *name){
             ///值就有了
        } ;

通知傳值

一個完整的通知一般包含3個屬性:

     - (NSString*)name; // 通知的名稱
     - (id)object; // 通知釋出者(是誰要釋出通知)
     - (NSDictionary*)userInfo; // 一些額外的資訊(通知釋出者傳遞給通知接收者的資訊內容)

圖片如下
image

程式碼如下

   ///獲取通知中心,點選按鈕傳送通知
    [[NSNotificationCenter defaultCenter] postNotificationName:@"noti" object:nil userInfo:@{@"key":name}];

     ///獲取通知中心,接收通知,呼叫方法
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(text:) name:@"noti" object:nil];

///實現通知方法
- (void)text:(NSNotification *)noti {
///noti中的key,就可以取出值
     NSString * name =  noti.userInfo[@"key"];

///在呼叫結束的時候,要移除通知
 - (void)dealloc {
          //[super dealloc];  非ARC中需要呼叫此句

          [[NSNotificationCenter defaultCenter] removeObserver:self];
   }

}