【问题标题】:Using assign with delegate将分配与委托一起使用
【发布时间】:2011-12-28 21:09:01
【问题描述】:

我有一个下载管理器,当数据准备好时,它会异步调用 viewController 的委托方法,但是如果用户按下返回(viewController 被删除并释放),下载管理器会尝试向未定义的委托发送消息。 为了避免这种情况,我试图在数据准备好时检查委托,以确保它不是 nil 并响应我试图调用的选择器。但是当我尝试检查它是否为 nil 时会引发异常。

我使用不保留的分配属性定义了委托。

我应该如何检查以避免委派未定义的控制器?

谢谢

【问题讨论】:

    标签: iphone ios


    【解决方案1】:

    听起来好像您以错误的方式实现了委托。

    您的下载管理器应该包含一个名为例如的实例变量。 delegate。在初始化下载管理器之后或期间,viewController 将自己设置为该下载管理器的委托 - 例如downloadManager.delegate = self;

    一旦卸载/释放,您的 viewController 应该将那个确切的值归零 - 有点像 `

    - (void)dealloc
    {
        downloadManager.delegate = nil;
        ...
        [super dealloc];
    }
    

    现在下载管理器可以毫无问题地检查它自己的实例变量(委托)是否存在非 nil 等。

    【讨论】:

    • 我缺少的一点是当我的控制器解除分配时将委托设置为 nil。谢谢:)
    【解决方案2】:

    在我看来,最好的解决方案是不要使用委托,而是使用 NSNotificationCenter 发送通知。
    你的 viewController 应该为这个通知定义了观察者。

    【讨论】:

    • 在我的情况下,使用 NotificationCenter 是一个有效的解决方案,但使用委托更合适。谢谢:)
    • 我一般不建议不要使用委托。委派非常适合一对一的关系,并使它们显而易见。每当我有一对 N 的关系时,我都会使用通知。
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 2017-04-16
    • 2011-03-23
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    相关资源
    最近更新 更多