【问题标题】:How to pass a property as a method parameter then set it to nil in a block in Objective-C?如何将属性作为方法参数传递,然后在 Objective-C 的块中将其设置为 nil?
【发布时间】:2020-09-16 12:22:49
【问题描述】:

我有以下情况,我发送属性self.view,它包含一些视图,作为以下方法的参数:

- (void) someMethod:(UIView *)view
{
    [UIView animateWithDuration:.25 delay:0 options: UIViewAnimationOptionAllowUserInteraction animations:^
     {
        //blablabla
     }
    completion:^(BOOL finished)
     {
        [view removeFromSuperview];
        view = nil;
     }];
}

编译器告诉我的地方:

变量不可赋值(缺少 __block 类型说明符)

我确实尝试将块类型说明符添加到参数中,但这不起作用。我想要这样当我将视图设置为nil 时,它也会将属性self.view 设置为nil。我很难解决这种情况,尤其是当你把块扔进去的时候,我想通常我需要一个双指针?

我想知道解决此问题的最佳方法是什么,我可以使用方法块中的参数将self.view 转换为nil

【问题讨论】:

  • 您认为这将如何运作?你认为什么时候会设置为nilview 只是一个参考;你认为消除该引用会做什么?
  • @matt 忽略我之前对您评论的回复。我已经更新了问题以使其更加清晰(抱歉,这些记忆内容有时让我感到困惑)。
  • 对,但是将view 参数设置为nil,即使您要这样做,也不会对self.view 产生任何影响。这就是我的观点。
  • @matt 是的,我刚刚意识到这一点。我想我要问的是如何通过将 self.view 作为参数发送到此方法来完成在完成块中将 self.view 设置为 nil ?我现在正在尝试使用双指针作为参数,但正在努力解决这个问题。
  • 我不明白你为什么要这么做。这里的大背景是什么?

标签: ios objective-c cocoa-touch objective-c-blocks


【解决方案1】:

您的问题是语言问题,从语言上讲,您所要求的内容是不可能的,即使可能也行不通。完成处理程序中的代码不能神奇地伸出手来消除您对某事的引用。

要了解原因,想象一下这是否是可能的!没有人可以编写任何代码,我们的应用程序总是会莫名其妙地失败或崩溃,因为我们永远无法确定我们对某物的引用是否被其他人神奇地破坏了。

【讨论】:

    【解决方案2】:

    在 Objective-C 中,__ 使您的变量在变量的词法范围和在变量的词法范围内声明或创建的所有块和块副本之间共享。在这种情况下,我建议您应该创建一个标志并在块中调用另一个函数来对视图执行某些操作。我认为将 UI 组件保留为共享变量是一种不好的方法。有时它可能会使您的应用崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2021-02-05
      • 2020-04-21
      • 2017-07-29
      • 2011-09-13
      • 2012-10-15
      相关资源
      最近更新 更多