我試圖保留一個塊的引用,這個塊被一個方法傳遞給我的類,稍後調用。但是,我遇到了麻煩,請保留一個參考。塊在NSDictionary(ARC)中被釋放
我認爲,顯而易見的方法是將其添加到伊娃集合中,所有這些都應該保持對其內容的強烈參考。但是當我試圖把它拉回來時,它是零。
的代碼非常簡單:
typedef void (^DataControllerCallback)(id rslt);
@interface DataController : NSObject {
NSMutableArray* queue;
}
- (void) addBlock:(DataControllerCallback)callback;
- (void) functionToBeCalledLater;
@end
@implementation DataController
- (id) init {
self = [super init];
if (self != nil) {
queue = [NSMutableArray new];
}
return self;
}
- (void) addBlock:(DataControllerCallback)callback {
NSDictionary* toAdd = [NSDictionary dictionaryWithObjectsAndKeys:
[callback copy], @"callback",
@"some other data", @"data", nil];
[queue addObject:toAdd];
}
- (void) functionToBeCalledLater {
NSDictionary* dict = [queue lastObject];
NSLog(@"%@", [dict objectForKey:@"data"]; //works
DataControllerCallback callback = [dict objectForKey:@"callback"]; //this is nil
callback(@"an arguemnt"); //EXC_BAD_ACCESS
}
發生了什麼事?
更新:我已經與[callback copy]
嘗試過了,只是callback
插入字典,既不作品。
更新2:如果我只是堅持我的塊成的NSMutableSet,只要我打電話copy
,我沒事。它效果很好。但是,如果它在一個NSDictionary中,它不會。
我實際上已經通過在創建NSDict之後放置一個斷點來測試它,並且回調永遠不會被插入。該描述清楚地表明「1個鍵值對」,而不是兩個。
我目前正在解決這個與專門的類,只是作爲一個容器。 callback
財產宣佈爲strong
;我甚至不需要使用copy
。
但問題仍然存在:爲什麼會發生這種情況?爲什麼NSDictionary不存儲塊?這是否與iOS 4.3的目標有關,因此ARC必須作爲靜態庫來構建?
更新3:女士們,先生們:我是個白癡。
我在這裏介紹的代碼顯然是實際代碼的簡化版本;最特別的是,它將一些鍵/值對留在字典中。
如果您使用[NSDictionary dictionaryWithObjectsAndKeys:]
存儲一個NSDictionary一個值,你可要該死確保這些值的一個不nil
。
其中之一是。
ICYMI,它導致參數列表提前終止。我有一個userInfo類型的參數被傳入「add to queue」方法之一,當然,你可以傳入「nil」。然後,當我構造字典時,夾住這個參數導致構造函數認爲我已經終止了參數列表。 @"callback"
是字典構造函數中的最後一個值,它永遠不會被存儲。
我複製並粘貼了這個代碼[callback copy],它一切正常。 –
'functionToBeCalledLater'出現在運行循環的不同迭代中,儘管我認爲這並不重要,但也許它與ARC放置其保留和釋放的位置有關。 –
我在runloop的不同迭代中調用了functionToBeCalledLater(爲它做了一個小按鈕,事實上多次敲擊它) –