2013-01-08 28 views
0

我試圖通過一個方法將委託傳遞給另一個對象。它工作簡單,但後來變爲空。我想我已經弄清楚是什麼導致了它,但沒有如何解決它。停止複製變量的塊

因此,iOS中的塊會自動複製所引用的任何變量。我有一個用戶傳入委託對象的方法。爲受管對象上下文執行一個塊,然後在委託傳遞的地方發出Web請求。我認爲正在發生的事情是,這個塊是製作委託對象的副本,並將它傳遞給請求,但隨後塊完成執行並且委託被釋放。

有沒有一種方法可以簡單地傳遞原始委託對象而不是複製它的副本?

NSManagedObjectContext *context = [[MPCoreDataManager sharedInstance] managedObjectContext]; 
[context performBlock:^{ 
    __block NSError *error; 
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([self class])]; 
    [request setSortDescriptors:@[[[NSSortDescriptor alloc] initWithKey:key ascending:asc selector:@selector(caseInsensitiveCompare:)]]]; 

    NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request 
                       managedObjectContext:context 
                        sectionNameKeyPath:keyPath 
                          cacheName:nil]; 

    [controller performFetch:&error]; 

    if (!controller.fetchedObjects || controller.fetchedObjects.count == 0) { 
     // Nothing found or an error, query the server instead 
       NSString *url = [NSString stringWithFormat:@"%@%@", kMP_BASE_API_URL, [self baseURL]]; 
     MPRequest *objRequest = [MPRequest requestWithURL:url]; 
      objRequest.delegate = delegate; 

     [objRequest setRequestMethod:@"GET"]; 
     [MPUser signRequest:objRequest]; 

     [objRequest submit:^(MPResponse *resp, NSError *err) { 
      if (err) { 
       block(nil, err); 
      } else { 
       NSArray *objects = [self createListWithResponse:resp]; 
         objects = [MPModel saveAllLocally:objects forEntityName:NSStringFromClass([self class])]; 
       [controller performFetch:&error]; 
       block(controller, nil); 
      } 

     }]; 

    } else { 
     // Great, we found something :) 
     block (controller, nil); 
    } 
}]; 

這是我正在使用的代碼。正如你所看到的,代表在這裏使用objRequest.delegate = delegate;,但由ARC發佈,因爲它是一個副本,而不是原來的。

我怎樣才能解決這個

回答

0

Got it排序。是一個混合我是一個白癡,並沒有意識到,我的NSLog輸出,說委託是空的事實上是一個完全不同的請求,以及塊的內存管理。

+0

也許你可以接受這個答案,刪除問題或提供另一個解釋答案:) – Tieme

+0

啊對不起!我打算接受這個答案,但最初這個問題並不讓我感到太新。現在完成:) – PaReeOhNos

+0

會發生很多:) – Tieme

-1

塊中的對象不會複製它裏面,它只是抓住他們(ARC增加保留計數)。

我想你的委託是一個弱引用,它不會被這個塊捕獲。您可以通過傳遞給該代表的強烈參考來解決此問題。

+0

雖然我不需要保留委託。在這種情況下委託是一個視圖控制器,所以它不會被釋放,我的請求委託被定義爲'@property(nonatomic,weak)'。當然,如果我通過代表強大,它會再次保留它? – PaReeOhNos

+0

那麼你說,代表如果釋放。如果是這種情況,你需要保留它。如果你把它傳遞給強者,它會增加它的ARC保留值。 –

+0

該塊複製在創建塊時捕獲的所有變量的值,除非該變量被聲明爲「__block」,在這種情況下,它保存對該變量的引用。對於捕獲的指向對象的變量,當模塊被複制時,它也會保留它們。 – newacct