【问题标题】:Retaining/Copy Block Arc [iOS]保留/复制块弧 [iOS]
【发布时间】:2012-11-05 15:13:03
【问题描述】:

我已经看到很多答案,但我找不到任何解决我的问题的方法。

我基本上有一个只使用类方法的类。我从不分配这个类。因此,我将一个块传递给它并将其存储在类的 .h 上的静态中,如下所示:

static ErrorBlock _errorBlock;

我是这样存储的:

_errorBlock = [errorBlock copy];

我收到errorBlock 作为方法的参数。经过一些计算,我像这样调用块:

   _errorBlock(error);

值得一提的是,我是从一个类的类别中调用它的。应用程序基本返回:

EXC_BAD_ACCESSS(code=2, adress = 0xc)

当我检查_errorBlock 值时,它是nil。所以我的问题是,我怎样才能保持对块的实时引用?

【问题讨论】:

    标签: objective-c ios automatic-ref-counting block


    【解决方案1】:

    如果 _errorBlock 为“nil”,可以肯定地说它是用 nil 分配的,并且没有任何引用来保持它的活动状态。如果您在NSObject *reference = someObject 中创建引用并且 someObject 被释放,您的引用指针仍将指向 someObject 曾经存在且不应为 nil 的位置。检查分配块是否有问题,或者它是否被调用。此外,您可能需要在调用之前检查 _errorBlock 是否存在。

    【讨论】:

    • _errorBlock = [errorBlock copy];发生时,_erroBlockerroBlock 都不是零。
    • 奇怪。一定有什么东西把它设置为 nil .. 还有其他东西使用这个块吗?分配后可以直接调用吗? (用同样的方法)
    • 没有其他东西在调用它。为了确定,我已经进行了项目搜索。
    • 我打开了一个新项目,这段代码对我有用..: static void (^doStuff)(int a); + (void)setDoStuff:(void (^)(int))inputN { doStuff = [inputN 复制]; } + (void)performDo { doStuff(0); } - (void)viewDidLoad { [ViewController setDoStuff:^(int a) { NSLog(@"%d", a); }]; [超级视图DidLoad]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [ViewController performDo]; }
    【解决方案2】:

    我能够解决它,我完全删除了全局块的使用。目前我使用块作为参数传递它们。

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多