iOS類與類之間的三種傳值方式
阿新 • • 發佈:2019-01-22
一代理方式
什麼是代理模式
傳入的物件,代替當前類完成了某一個功能,稱為代理模式.
實現代理有以下方法
在要傳值的類中
1> 宣告代理方法
2> 定義代理屬性
3> 在適當的時候呼叫代理方法
在要接受值的類中
1> 設定代理物件
2> 遵守代理協議
3> 實現代理方法
圖片如下:
程式碼如下
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 型別名稱)(形參列表)
圖片如下
程式碼如下
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; // 一些額外的資訊(通知釋出者傳遞給通知接收者的資訊內容)
圖片如下
程式碼如下
///獲取通知中心,點選按鈕傳送通知
[[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];
}
}