【问题标题】:Delegating the even callback in objective-C在 Objective-C 中委托偶数回调
【发布时间】:2016-10-09 18:20:42
【问题描述】:

我正在尝试了解事件回调委托是如何工作的。到目前为止,我已经编写了以下代码,顺便说一句工作得很好:

Bridge.h

@protocol BridgeDelegate <NSObject>

- (void) bridgeLock;

@end

@interface Bridge : NSObject
+(instancetype) sharedInstance;
@property (weak, nonatomic) id<BridgeDelegate> bridgeDelegate;
- (void) wipe;


@end

桥.m

@implementation Bridge

+(instancetype) sharedInstance {
    static dispatch_once_t pred;
    static id shared = nil;
    dispatch_once(&pred, ^{
        shared = [[super alloc] initUniqueInstance];
    });
    return shared;
}

-(instancetype) initUniqueInstance {
    return [super init];
}

- (void) wipe
{
    NSLog(@"lock in bridge called");

    if(self.bridgeDelegate)
    {
        [self.bridgeDelegate bridgeLock];
    }
}

@end

插件.h

@interface Plugin : NSObject<BridgeDelegate>

@property (strong, nonatomic) Bridge *bridge;
- (void) pluginInitialize;


@end

插件.m

@implementation Plugin


- (void) pluginInitialize
{
    self.bridge = [Bridge sharedInstance];
    self.bridge.bridgeDelegate = self;
}

- (void)bridgeLock
{
    NSLog(@"lock in plugin called");


}

@end

当我在 applicationDidBecomeActive 中调用以下代码时

Bridge* bridge = [Bridge sharedInstance];
Plugin* plugin = [[Plugin alloc] init];
[plugin pluginInitialize];
[bridge wipe];

我得到以下预期输出:

 lock in bridge called
 lock in plugin called

现在我的问题:

  1. 委托的具体工作情况如何?从某种意义上说,Plugin 只是实现了bridgewipe() 的功能,对吧?首先为什么以及如何调用bridgeLock?

  2. 这是否与 Bridge 是单例的事实有关。如果我将 Bridge 设为非单例类,最终结果是否相同。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    1.委托的具体工作情况如何?从某种意义上说,Plugin 只是实现了 bridgewipe() 函数,对吧?首先为什么以及如何调用bridgeLock?

    在上面粘贴的代码中“Plugin.m”正在实现 - (void)bridgeLock

    1. 这是否与 Bridge 是单例的事实有关。如果我将 Bridge 设为非单例类,最终结果是否相同。

    【讨论】:

      【解决方案2】:

      Bridge* bridge = [Bridge sharedInstance];

      这座桥我们称之为B1;

      B1是通过"sharedInstance"方法制作的实例;

      然后你调用下面的代码:

      Plugin* plugin = [[Plugin alloc] init];
      [plugin pluginInitialize];
      

      pluginInitialize 方法你的代码是

      {
          self.bridge = [Bridge sharedInstance];
          self.bridge.bridgeDelegate = self;
      }
      

      当代码执行时,self.bridge 也是一个实例,通过 "sharedInstance"; 方法创建,它等于 B1 的地址,也使 B1 的delegate == self;

      所以当你打电话给[bridge wipe];

      1. 它将nslog @"lock in bridge called";
      2. 因为self.bridgeDelegate不是nil,所以delegate会调用bridgeLock方法;
      3. 然后nslog @"lock in plugin called"

      关于您的第二个问题,当您将 Bridge 设为非单例类时,我认为结果会有所不同。

      【讨论】:

      • 嗨@ezatu,感谢您抽出宝贵的时间来写这篇文章。我玩弄了我的代码,正如哈里萨曼在他的回答中提到的那样,班级是否是单身人士并不重要。为此,我接受了他的回答。再次感谢。
      【解决方案3】:

      @hariszaman,解释是正确的,但我想对此进行更多扩展,以便将来对某人有所帮助。基本上就是这样。

      1. 我正在创建 Bridge 类的实例。内存中的这个实例有一个 BridgeDelegate 类型的引用变量。
      2. 当我实例化插件时,BridgeDelegate 变量开始指向插件类实例。
      3. 现在调用 lock 时,它会调用 BridgeDelegate 指针指向的类的 bridgelock 方法,在本例中为 Plugin。
      4. 如果 Bridge 类不是单例也没关系,因为 pluginInitialize 中有以下行:

        {
        self.bridge = [Bridge sharedInstance];
        self.bridge.bridgeDelegate = self;
        }
        

      将改为:

        {
      self.bridge = [[Bridge alloc] init];
      self.bridge.bridgeDelegate = self;
      
        }
      

      步骤 1,2 和 3 将以相同的方式重复。

      【讨论】:

        猜你喜欢
        • 2014-11-16
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多