在Objective-c中获取UIImage的分配数加1?

时间:2010-07-10 06:30:39

标签: objective-c count uiimage memory-management

我在下面的代码中得到分配计数加一。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"MasterViewIdentifier"] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selectionStyle = UITableViewCellEditingStyleNone;
        UIView* elementView =  [ [UIView alloc] initWithFrame:CGRectMake(5,5,312,480)];
        elementView.tag = 0;
        [cell.contentView addSubview:elementView];
        [elementView release];
    }
    UIView* elementView  = [cell.contentView viewWithTag:0];
    for(UIView* subView in elementView.subviews)
    {
        [subView removeFromSuperview];
    }

    if(indexPath.section==0)
    {
        if(indexPath.row==0)
        {
                   // i have tried like this but getting exception.
            /*
            UIImage *cellBackImag=[UIImage imageNamed:@"celltop.png" ];
            UIImageView* imaeView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 43)];
            imaeView.image=cellBackImag;
            [elementView addSubview:imaeView];
            [imaeView release];
            [cellBackImag release];
             */


            // here I am getting uiimage count allocation count 
            UIImageView* imaeView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"celltop.png" ]];
            imaeView.frame=CGRectMake(0, 0, 300, 43);
            [elementView addSubview:imaeView];
            [imaeView release];

请帮帮我,谢谢你, Madan Mohan

1 个答案:

答案 0 :(得分:2)

首先,你不应该依赖保留计数,因为当你将对象传递给某个方法时,所有事情都可能发生在这个对象上,就像有人保留它,再次自动释放它,将它传递给另一个方法等等所以价值非常不准确。

但在这种情况下,(至少)+1的保留计数是正确的,因为您希望将图像视图作为子视图添加到elementView后保持活动状态,因此{{1}保留您的图像视图(为保留计数添加+1),然后再次释放它(从alloc init保留+1)。

您使用已注释掉的代码获得异常的原因是您为[element addSubview:imageView]创建了一个自动释放的对象,然后将其释放。在您的方法返回后,自动释放池将在某个时刻再次释放图像,然后它将崩溃。

所以基本上只是坚持使用第二种方法(alloc,init,add,release)并忘记保留计数。如果你担心内存泄漏,你应该看看Instruments,这是一个很好的工具,可以找到各种错误。