簡體   English   中英

使用局部變量調用dispatch_async時出現內存問題

[英]Memory issue when calling dispatch_async with local variable

調用dispatch_async時,我在代碼中遇到問題。 我認為這個問題是由於ARC在分塊中使用該對象之前回收了該對象,因為分派該對象的方法完成了。

- (void) method:(SomeClass *) someClass {
  // local variable
  NSNumber *someValue = someClass.somePropertyOnManagedObject;
  dispatch_async(queue, ^() {
    /* call some singleton object passing variable 
     * when access the variable, reference is nil
     */
    [[DashboardFacade sharedInstance] someMethod:someValue];
  });
}

看完許多文檔后,我得出結論

  • 塊訪問無參數-無需討論
  • 塊訪問簡單類型參數,例如BOOL,int-這些參數已復制且沒有問題
  • 阻止訪問調度它的方法的參數-我不確定,但是認為可以
  • 阻止訪問self的屬性-只要self“存在”,直到呼叫完成即可
  • 塊訪問調度局部變量的方法中的局部變量
    • 如果我們使用一些信號量,以便我們在退出方法之前等待塊返回,那么一切正常
    • 否則,變量可能已經被垃圾回收,然后才可以使用塊。

我認為解決方案是使用__block修飾符,以便ARC保留變量。

我的問題是

  • 以上技術上是否正確,例如,使用__block可以解決問題,而不會引入其他問題?
  • 為什么我不能在Internet / Google上的任何地方找到它?

以上技術上是否正確,例如,使用__block可以解決問題,而不會引入其他問題?

是的,它在技術上是正確的,在ARC上, __block允許您更改在塊上下文之外聲明的變量(在本例中為變量指向的位置,因為它是NSNumber * )。

為什么我不能在Internet / Google上的任何地方找到它?

我認為問題與代碼的特定位置無關,而是其他原因。

僅在此分配之后為零時,塊內的someValue才能為零:

NSNumber *someValue = someClass.somePropertyOnManagedObject;

塊保留由於塊內使用的那些變量而被塊捕獲的對象。 而且它是self還是塊可見的作用域中的局部變量都沒有關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM