iphone sdk 值从给定 exc 错误访问的数组中删除

Posted

技术标签:

【中文标题】iphone sdk 值从给定 exc 错误访问的数组中删除【英文标题】:iphonesdk value removing from arrray given exc bad access 【发布时间】:2011-11-02 08:30:29 【问题描述】:

我已经实现了这段代码,当我尝试添加对象时它工作正常,但是当我尝试删除对象时它给了我 exc_bad_access,我尝试通过放置断点来找出原因,但我仍然无法得到原因。请帮帮我。

在 .h 文件中

BOOL prayValues[1000];
BOOL praiseValues[1000];
IBOutlet UITableView *prayTable;
IBOutlet UITableView *praiseTable;
NSMutableArray *publishingMyPosts;




- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    //NSLog(@"sterrrr----%@",str);

    if (tableView == myTableView) 
    NSLog(@"did select in tableview");
    



    if (jsonRequestChecking==2) 

        UITableViewCell *thisCell1 = [prayTable cellForRowAtIndexPath:indexPath];
        UITableViewCell *thisCell2 = [praiseTable cellForRowAtIndexPath:indexPath];

    if (tableView == prayTable) 
        NSLog(@"did select in prayTable");      
        prayValues[indexPath.row] = !prayValues[indexPath.row];

        if (prayValues[indexPath.row])  
            thisCell1.accessoryType = UITableViewCellAccessoryCheckmark;
            NSLog(@"this cell1 text %@",thisCell1.textLabel.text);
            str=[NSString stringWithFormat:@"%@",[[publicArray objectAtIndex:indexPath.row] objectForKey:@"id"]];

            if (([publishingMyPosts containsObject:str] == NO))

                [publishingMyPosts addObject:str];
            //  NSLog(@"publishing my post %@",publishingMyPosts);


            

         else 
            thisCell1.accessoryType = UITableViewCellAccessoryNone;

            [publishingMyPosts  removeObject:str];
            //NSLog(@"publishing my post %@",publishingMyPosts);

        



        



    if (tableView == praiseTable) 
        NSLog(@"did select in praiseTable");
        praiseValues[indexPath.row] = !praiseValues[indexPath.row];
        if (praiseValues[indexPath.row])  
            str1=[NSString stringWithFormat:@"%@",[[privateArray objectAtIndex:indexPath.row] objectForKey:@"id"]];
            thisCell2.accessoryType = UITableViewCellAccessoryCheckmark;
            NSLog(@"this cell2 text %@",thisCell2.textLabel.text);

            if (([publishingMyPosts containsObject:str1] == NO))
                [publishingMyPosts addObject:str1];
            //  NSLog(@"publishing my post %@",publishingMyPosts);


            

         else 
            thisCell2.accessoryType = UITableViewCellAccessoryNone;
            [publishingMyPosts  removeObject:str1];
            //NSLog(@"publishing my post %@",publishingMyPosts);

        

        
    

    NSLog(@"publishing my post %@",publishingMyPosts);

    

【问题讨论】:

认为这一定与您的 str 在调用之间被自动释放有关吗?还在看。 你确定你的应用程序由于从数组中删除了 obj 而崩溃了吗??? 是的。我敢肯定,当我尝试删除对象时,它给了我非常糟糕的访问权限,并且它随机有时会删除 3 个对象,然后在删除 2 个对象时给我非常糟糕的访问权限和一些时间 NSString * str; NSString * str1;在具有非原子属性的 .h 文件中声明并保留和即时释放它。 您在代码中使用的是[str release] 还是[str1 release]`???? 【参考方案1】:

您的 indexpath.row 似乎是个问题,希望这可能有效:

    if (indexPath.row < [publicArray count] ) 
    str=[NSString stringWithFormat:@"%@",[[publicArray objectAtIndex:indexPath.row] objectForKey:@"id"]];
    NSLog(@"str === %@",str);
    

    if (indexPath.row < [privateArray count] ) 
    str1=[NSString stringWithFormat:@"%@",[[privateArray objectAtIndex:indexPath.row] objectForKey:@"id"]];
    NSLog(@"str1 === %@",str1);

    if (tableView == myTableView) 
    NSLog(@"did select in tableview");
    



    if (jsonRequestChecking==2) 

        UITableViewCell *thisCell1 = [prayTable cellForRowAtIndexPath:indexPath];
        UITableViewCell *thisCell2 = [praiseTable cellForRowAtIndexPath:indexPath];

    if (tableView == prayTable) 

        prayValues[indexPath.row] = !prayValues[indexPath.row];
        if (prayValues[indexPath.row])  
            thisCell1.accessoryType = UITableViewCellAccessoryCheckmark;


            if (([publishingMyPosts containsObject:str] == NO))

                [publishingMyPosts addObject:str];

            

            

        else 
            thisCell1.accessoryType = UITableViewCellAccessoryNone;

            [publishingMyPosts  removeObject:str];
           



    



        if (tableView == praiseTable) 

            praiseValues[indexPath.row] = !praiseValues[indexPath.row];
            if (praiseValues[indexPath.row])  
                thisCell2.accessoryType = UITableViewCellAccessoryCheckmark;


                if (([publishingMyPosts containsObject:str1] == NO))

                    [publishingMyPosts addObject:str1];

                

            

            else 
                thisCell2.accessoryType = UITableViewCellAccessoryNone;

                [publishingMyPosts  removeObject:str1];
               



        






    

【讨论】:

【参考方案2】:

像这样声明你的 str...

NSString *str = [[ NSString StringWithFormat:@"你的字符串"] 保留];

或者写你的str @property (nonatomic,retain) 和@synthesize,因为有时候String 会被自动释放,所以写retain。我认为它可以帮助你.....

【讨论】:

【参考方案3】:

我认为这是因为您没有通过删除相应的行来更新 uitableview。因此,表视图会尝试加载您刚刚删除的数据并崩溃。您应该在 removeObject 之后立即调用 DeleteRowsAtIndexPaths,或者在函数结束时调用 reloadData。

【讨论】:

以上是关于iphone sdk 值从给定 exc 错误访问的数组中删除的主要内容,如果未能解决你的问题,请参考以下文章

JSON 和 Iphone 表加载,滚动时出现 EXC_BAD_ACCESS 错误

iPhone - 线程 1 EXC_BAD_INSTRUCTION 错误,控制台中没有打印任何内容

iPhone 模拟器启动时的 EXC_BAD_ACCESS。应用程序在设备上运行

ALAsset 指针在访问时抛出 EXC_BAD_ACCESS

如何诊断 iPad iPhone 应用程序中的 EXC_BREAKPOINT (SIGTRAP) 崩溃?

Exc 访问错误