xcode 中的 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】xcode 中的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS in xcode 【发布时间】:2011-06-20 12:52:37 【问题描述】:

在我的应用程序中,我使用数组来打印表格视图中存在的图像视图中的图像。该数组用于存储我在文本框中输入的组件,每个组件由空格分隔,例如我输入 Boy Girl然后数组会将男孩存储为一个对象,将女孩存储为另一个,然后搜索每个对象的图像。以下是我的代码:-

-(IBAction)Click


    //count = [youSaid.text intValue];
    //count=1;
    //NSArray *sub= [youSaid.text componentsSeparatedByString:@" "];
    j=1;
    sentence=[youSaid.text componentsSeparatedByString:@" "];

    //[substring addObject:youSaid.text];
    [tableView reloadData];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = nil;

    static NSString *AutoCompleteRowIdentifier = @"AutoCompleteRowIdentifier";

    cell = [tableView dequeueReusableCellWithIdentifier:AutoCompleteRowIdentifier];
    if (cell == nil) 

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:AutoCompleteRowIdentifier] autorelease];
        UIImageView * imageView1 = [[[UIImageView alloc] initWithFrame:CGRectMake(25, 4, 80, 80)] autorelease];
        UIImageView * imageView2 = [[[UIImageView alloc] initWithFrame:CGRectMake(115,4,80, 80)] autorelease];
        UIImageView * imageView3 = [[[UIImageView alloc] initWithFrame:CGRectMake(205,4, 80, 80)] autorelease];
        UIImageView * imageView4 = [[[UIImageView alloc] initWithFrame:CGRectMake(295,4, 80, 80)] autorelease];
        imageView1.tag = j;
        imageView2.tag = j+1;
        imageView3.tag = j+2;
        imageView4.tag = j+3;
        //imageView1.tag=t;
//      t++;
//      imageView2.tag=t;
//      t++;
//      imageView3.tag=t;
//      t++;
//      imageView4.tag=t;
//      t++;

        [cell.contentView addSubview:imageView1];
        [cell.contentView addSubview:imageView2];
        [cell.contentView addSubview:imageView3];
        [cell.contentView addSubview:imageView4];

    
    //[sentence addObject:@"BLINK"];
    // UIImageView * imageView;
    //for ( int i = 1; i <= j; i++ ) 
        for ( int i = 1; i <= j; i++ ) 
        imageView = (UIImageView *)[cell.contentView viewWithTag:i];

        //button = (UIButton *)[cell.contentView viewWithTag:i];
        imageView.image = nil;

        //[button setImage:nil forState:UIControlStateNormal];
    


    int photosInRow;
    //NSLog([NSString stringWithFormat:@"%d", [sentence count]]);

    if ( (indexPath.row < [tableView numberOfRowsInSection:indexPath.section] - 1) 
|| ([sentence count] % 4 == 0) ) 

        photosInRow = 4;

     else 
        photosInRow = [sentence count] % 4;
    

   // for ( int i = 1; i <= photosInRow; i++ ) 
    for ( int i = 1; i <=[sentence count]; i++ )
        imageView = (UIImageView *)[cell.contentView viewWithTag:i];

        //button = (UIButton *)[cell.contentView viewWithTag:i];

        [self setImage1:imageView];

        //[self setImage1:button];

        //imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png", i]];

        //imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", youSaid.text]];

                //imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"1.png"]];

    



    //cell.textLabel.text = [autoCompleteArray objectAtIndex:indexPath.row];
    return cell;

当我以其他方法访问我的数组时,我得到了 EXC_BAD_ACCESS。这是什么原因。请帮忙。

谢谢, 克里斯蒂

【问题讨论】:

【参考方案1】:

添加保留....

sentence=[youSaid.text componentsSeparatedByString:@" "];
[sentence retain];

【讨论】:

是的,它起作用了,你能告诉我原因吗?我的意思是我在 .h fil 中保留了这个 因为 componentsSeparatedByString 返回一个自动释放的对象,而不保留它然后它被释放。您稍后尝试访问它,然后 BOOOOOOM! .h 文件中的retain 属性仅在您使用点符号语法时适用。 只有当你在属性上有一个保留属性时;)【参考方案2】:

如果sentence 是具有retain 属性的类属性,请使用点符号语法,即self.sentence = [youSaid.text componentsSeparatedByString:@" "]; 正确保留sentence 对象。确保在 dealloc 方法中释放 sentence 以避免内存泄漏。

【讨论】:

以上是关于xcode 中的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 8 中的 symbolicatecrash 位于何处?

Xcode 10 中的对象库去了哪里?

Interface Builder文件中的Xcode 6未知类

Xcode 7.3 中的设备状态无效

Xcode 7 中的 CoreData 类

如何在 Xcode 之外运行 Xcode 应用程序? MacOS 独立应用程序与 Xcode 模拟器中的应用程序运行方式不同