詳解iOS 實(shí)現(xiàn)一對(duì)多代理方案
實(shí)現(xiàn)方案一
利用可變數(shù)組。 簽協(xié)議方需要add到代理的數(shù)組中, 然后協(xié)議遍歷數(shù)組中的對(duì)象,進(jìn)行分發(fā)。
缺點(diǎn)是需要數(shù)組對(duì)其內(nèi)部元素是強(qiáng)引用, 需要在合適的地方對(duì)其進(jìn)行釋放,否則會(huì)有內(nèi)存泄漏
代理協(xié)議的對(duì)象.h寫(xiě)法
#import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGIN @protocol TestSubViewDelegate <NSObject> - (void)testSendSomeMessageToOther:(NSString *)somethings; - (void)testSendSome:(NSString *)somethings; @end @interface TestSubView : UIView //@property (nonatomic, weak)id <TestSubViewDelegate>delegate; @property (nonatomic, strong)NSMutableArray <id<TestSubViewDelegate>>* __nullable delegates; - (void)addDelegate:(id<TestSubViewDelegate>)delegate; // 需要在合適的地方銷毀對(duì)象。 - (void)destory; @end NS_ASSUME_NONNULL_END
.m代理協(xié)議分發(fā)機(jī)制
#import "TestSubView.h"
@interface TestSubView ()
@end
@implementation TestSubView
- (instancetype)init {
? ? if (self = [super init]) {
? ? ? ? self.delegates = [NSMutableArray array];
? ? ? ??
? ? ? ? // 測(cè)試,執(zhí)行
? ? ? ? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
? ? ? ? ? ? [self test1DelegateAction];
? ? ? ? });
? ? ? ??
? ? ? ? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
? ? ? ? ? ? [self test2DelegateAction];
? ? ? ? });
? ? ? ??
? ? }
? ? return self;
}
// 測(cè)試代理方法分發(fā)1
- (void)test1DelegateAction {
? ? [self.delegates enumerateObjectsUsingBlock:^(id<TestSubViewDelegate> ?_Nonnull delegate, NSUInteger idx, BOOL * _Nonnull stop) {
? ? ? ? if ([delegate respondsToSelector:@selector(testSendSomeMessageToOther:)]) {
? ? ? ? ? ? [delegate testSendSomeMessageToOther:@"傳遞的Some"];
? ? ? ? }
? ? }];
}
// 測(cè)試代理分發(fā)2
- (void)test2DelegateAction {
? ? [self.delegates enumerateObjectsUsingBlock:^(id<TestSubViewDelegate> ?_Nonnull delegate, NSUInteger idx, BOOL * _Nonnull stop) {
? ? ? ? if ([delegate respondsToSelector:@selector(testSendSome:)]) {
? ? ? ? ? ? [delegate testSendSome:@"傳遞的Some2-"];
? ? ? ? }
? ? }];
}
- (void)destory {
? ? [self.delegates removeAllObjects];
? ? self.delegates = nil;
}
- (void)addDelegate:(id<TestSubViewDelegate>)delegate {
? ? [self.delegates addObject:delegate];
}簽訂代理方1
#import "View1Controller.h"
#import "TestSubView.h"
@interface View1Controller ()<TestSubViewDelegate>
@end
@implementation View1Controller
- (void)viewDidLoad {
? ? [super viewDidLoad];
? ? TestSubView *ts = [TestSubView new];
? ? [ts addDelegate:self];
? ? [self.view addSubview:ts];
}
#pragma mark - TestSubViewDelegate
- (void)testSendSomeMessageToOther:(NSString *)somethings {
? ? NSLog(@"%@", somethings);
}
- (void)testSendSome:(NSString *)somethings {
? ? NSLog(@"%@", somethings);
}
?
@end簽訂方2
#import "ViewController.h"
#import "View1Controller.h"
#import "TestSubView.h"
@interface ViewController ()<TestSubViewDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
? ? [super viewDidLoad];
? ? TestSubView *ts = [TestSubView new];
? ? [ts addDelegate:self];
? ? [self.view addSubview:ts];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
? ? View1Controller *vc = [View1Controller new];
? ? [self presentViewController:vc animated:YES completion:nil];
}
#pragma mark - TestSubViewDelegate
- (void)testSendSomeMessageToOther:(NSString *)somethings {
? ? NSLog(@"%@", somethings);
}
@end實(shí)現(xiàn)方案二
采用NSPointerArray去聲明delegates的數(shù)組,這樣就可以不用操心管理內(nèi)存泄漏的問(wèn)題, 因?yàn)镹SPointerArray里面的元素都是weak化的。 會(huì)隨著當(dāng)前對(duì)象釋放而釋放掉。
還有一些NSHashTable NSMapTable 等等, 實(shí)現(xiàn)方式大同小異。
到此這篇關(guān)于詳解iOS 實(shí)現(xiàn)一對(duì)多代理方案的文章就介紹到這了,更多相關(guān)iOS 一對(duì)多代理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IOS實(shí)現(xiàn)視頻動(dòng)畫(huà)效果的啟動(dòng)圖
這篇文章實(shí)現(xiàn)的是一個(gè)關(guān)于啟動(dòng)頁(yè)或者引導(dǎo)頁(yè)的視頻動(dòng)畫(huà)效果的實(shí)現(xiàn)過(guò)程,對(duì)于大家開(kāi)發(fā)APP具有一定的參考借鑒價(jià)值,有需要的可以來(lái)看看。2016-09-09
詳解IOS判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的三種方法
這篇文章主要介紹了詳解IOS判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的三種方法,網(wǎng)絡(luò)狀態(tài)是非常重要的知識(shí),感興趣的同學(xué),必須要看一下2021-04-04
iOS實(shí)現(xiàn)動(dòng)態(tài)自適應(yīng)標(biāo)簽
這篇文章主要為大家詳細(xì)介紹了iOS動(dòng)態(tài)自適應(yīng)標(biāo)簽的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
IOS程序開(kāi)發(fā)之跳轉(zhuǎn)短信發(fā)送界面實(shí)現(xiàn)發(fā)送短信功能
在程序開(kāi)發(fā)中,我們經(jīng)常遇到這樣一功能:某個(gè)程序里面發(fā)送一些短信驗(yàn)證,那么基于代碼是如何實(shí)現(xiàn)的呢?下面小編通過(guò)本文給大家介紹IOS程序開(kāi)發(fā)之跳轉(zhuǎn)短信發(fā)送界面實(shí)現(xiàn)發(fā)送短信功能,有需要的朋友拿去用2016-01-01
深入講解iOS開(kāi)發(fā)中應(yīng)用數(shù)據(jù)的存儲(chǔ)方式
這篇文章主要介紹了iOS開(kāi)發(fā)中應(yīng)用數(shù)據(jù)的存儲(chǔ)方式,包括plistXML屬性列表和NSKeydeArchiver歸檔兩個(gè)部分,需要的朋友可以參考下2015-12-12

