0

ページの読み込み時に200個のオブジェクトを含む配列があり、これら(可変コピー)をfilteredarrayという一時配列にコピーし、それをuitableviewに表示します。これはすべて正常に動作します:)

次に、選択すると、予測を使用して元の配列をフィルター処理することになっているセグメントセレクターがあり、filteredarray は、予測基準を満たすオブジェクトの内容を穴を開けるようになり、これが正常に機能していることがわかります:)

次に、テーブルビューを再読み込みしようとします(再びfilteredarrayを使用)。ステップスルーすると、filteredarrayの最初のいくつかのオブジェクトでは問題なく動作するように見えますが、filteredarrayは正しい単語であれば「空」のように見え、コードは直後にクラッシュしますテーブルの更新が開始されました。それはメモリの問題か何かに違いないと確信しています。私はObjective Cにかなり慣れていないので、どんな助けでも大歓迎です。以下に私のコードの一部をリストしました

- (void)viewDidLoad
{
[super viewDidLoad];    
appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
filteredArray = [appDelegate.originalArray mutableCopy];    
}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *cellidentifier = @"customcell";
customcell *cell = (customcell *)[tableView dequeueReusableCellWithIdentifier:
                                  cellidentifier];
array_details *arrayObj = [filteredArray objectAtIndex:indexPath.row];

// UITableViewCell cell needs creating for this UITableView row.
if (cell == nil)
{
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"customcell" owner:self options:nil];

    for (id currentObject in topLevelObjects) {
        if ([currentObject isKindOfClass:[customcell class]]) {
            cell = (customcell *) currentObject;
            break;
        }
    }
}


    cell.line1.text = arrayObj.line1;
    cell.line2.text = arrayObj.line2;
return cell;
}


-(IBAction)change_segment:(id)sender;{
if(segmentcontrol.selectedSegmentIndex == 2){
    filteredArray = [appDelegate.originalArray mutableCopy];      
    NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"selected == YES"];
    filteredArray = [filteredArray filteredArrayUsingPredicate:testForTrue]; 
}   

[my_table reloadData];  // its when i do this that the array filtered array seems to somehow get "emptied"

私のfilteredarrayはmy.hファイルでnsmutable配列として宣言されています

NSMutableArray *filteredArray;
4

2 に答える 2

1

NSMutableArray があるので、filterUsingPredicate:代わりに を使用することをお勧めしfilteredArrayUsingPredicate:ます。最初にフィルター処理された配列は保持されます。これは、コピーを介して取得するためですが、メソッドで置き換える配列は保持されchange_segment:ません。

(これが問題だと思いますが、クラッシュとそれに関連する例外の詳細により、診断が容易になります。)

于 2012-05-12T19:41:52.573 に答える
0

配列を保持します。-dealloc で解放します。

filteredArray = [appDelegate.originalArray mutableCopy]retain];

于 2012-05-12T20:46:03.440 に答える