詳解iOS 實現(xiàn)一對多代理方案
實現(xiàn)方案一
利用可變數(shù)組。 簽協(xié)議方需要add到代理的數(shù)組中, 然后協(xié)議遍歷數(shù)組中的對象,進行分發(fā)。
缺點是需要數(shù)組對其內部元素是強引用, 需要在合適的地方對其進行釋放,否則會有內存泄漏
代理協(xié)議的對象.h寫法
#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; // 需要在合適的地方銷毀對象。 - (void)destory; @end NS_ASSUME_NONNULL_END
.m代理協(xié)議分發(fā)機制
#import "TestSubView.h" @interface TestSubView () @end @implementation TestSubView - (instancetype)init { ? ? if (self = [super init]) { ? ? ? ? self.delegates = [NSMutableArray array]; ? ? ? ?? ? ? ? ? // 測試,執(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; } // 測試代理方法分發(fā)1 - (void)test1DelegateAction { ? ? [self.delegates enumerateObjectsUsingBlock:^(id<TestSubViewDelegate> ?_Nonnull delegate, NSUInteger idx, BOOL * _Nonnull stop) { ? ? ? ? if ([delegate respondsToSelector:@selector(testSendSomeMessageToOther:)]) { ? ? ? ? ? ? [delegate testSendSomeMessageToOther:@"傳遞的Some"]; ? ? ? ? } ? ? }]; } // 測試代理分發(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
實現(xiàn)方案二
采用NSPointerArray去聲明delegates的數(shù)組,這樣就可以不用操心管理內存泄漏的問題, 因為NSPointerArray里面的元素都是weak化的。 會隨著當前對象釋放而釋放掉。
還有一些NSHashTable NSMapTable 等等, 實現(xiàn)方式大同小異。
到此這篇關于詳解iOS 實現(xiàn)一對多代理方案的文章就介紹到這了,更多相關iOS 一對多代理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
IOS程序開發(fā)之跳轉短信發(fā)送界面實現(xiàn)發(fā)送短信功能
在程序開發(fā)中,我們經(jīng)常遇到這樣一功能:某個程序里面發(fā)送一些短信驗證,那么基于代碼是如何實現(xiàn)的呢?下面小編通過本文給大家介紹IOS程序開發(fā)之跳轉短信發(fā)送界面實現(xiàn)發(fā)送短信功能,有需要的朋友拿去用2016-01-01深入講解iOS開發(fā)中應用數(shù)據(jù)的存儲方式
這篇文章主要介紹了iOS開發(fā)中應用數(shù)據(jù)的存儲方式,包括plistXML屬性列表和NSKeydeArchiver歸檔兩個部分,需要的朋友可以參考下2015-12-12