所以我試圖解決這個真煩人的錯誤。如果我使用NSPredicate像理想版本那樣過濾我的數組,我將得到EXC_BAD_ACCESS,因爲它會嘗試調用作爲委託傳入的對象的額外時間釋放。如果我用工作版本過濾,它工作正常。我認爲這兩個實現是相同的。我哪裏錯了?我知道謂詞方式是要走的路,只是無法讓它正常工作。NSPredicate內存問題
// Ideal version
- (NSArray *)foosWithDelegate:(id)delegate {
return [foos filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"delegate = %@", delegate]];
}
// Working version
- (NSArray *)foosWithDelegate:(id)delegate {
NSMutableArray *results = [[NSMutableArray alloc] init];
for (MYFoo *foo in foos) {
if (foo.delegate == delegate) {
[results addObject:foo];
}
}
if ([results count] == 0) {
[results release];
return nil;
}
return [results autorelease];
}
foos
是一個伊娃。 MYFoo
類有代表assign
代理的屬性。即使foos
爲空,問題仍然會發生。
示例對我沒有'EXC_BAD_ACCESS'。你會發佈一個產生相同錯誤的最小測試用例,特別是顯示'foosWithDelegate'調用周圍的代碼嗎? – outis 2009-11-06 19:58:06
這是[示例項目](http://github.com/samsoffes/predicate-test)。它不會崩潰,因爲視圖控制器仍在內存中。如果這是在導航控制器的情況下,它會在你回擊並且視圖控制器被釋放時崩潰。 您可以看到保留計數在理想版本的方法之後發生變化,並且與方法的工作版本沒有關係。 – 2009-11-06 20:24:47
您是否找到修復程序? – JoePasq 2010-05-06 20:01:18