在Objective-C中分配对象,内存管理

时间:2011-07-22 20:55:15

标签: iphone objective-c memory-management

我有一个关于在objective-c中分配对象的超级noob问题。我基本上正在尝试创建一个缩略图数组来使用。我从另一篇文章中获得了这段代码。

+ (UIImage *)scale:(UIImage *)image toSize:(CGSize)size
{
    UIGraphicsBeginImageContext(size);
    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return scaledImage;
}

在我的viewDidLoad中,我这样做:

// Create thumbnail images to be used in UITableView.
    NSMutableArray *imageArray = [[NSMutableArray alloc] initWithCapacity:[_list count]];  // list is an array that has my data
    for (id *test in _list) {
        UIImage *cardImage = [UIImage imageNamed:test.ImageFile];  // line 1
        cardImage = [UIImage scale:cardImage toSize:CGSizeMake(50, 50)];  // line 2
        [imageArray addObject:cardImage];  // line 3
    }
    self.List = imageArray;
    [imageArray release];

我的问题是关于for循环内部。这是我对它是如何工作的理解,如果我错了,请纠正我。

第1行创建一个名为cardImage的自动释放UIImage。

第2行从scale:toSize:方法创建另一个UIImage。 (我不确定这个UIImage是否是自动释放的)。 cardImage现在指向第2行创建的新UIImage,稍后将清除第1行中自动释放的UIImage。

第3行将新对象添加到imageArray。

我不确定这是对还是错/好/坏等等。我知道一种方法中的原始类型,你可以做到

int x = 5;
x = 10;

但是我不确定我是否在这里创建内存泄漏,如果有更好的方法。非常感谢!

1 个答案:

答案 0 :(得分:2)

+ (UIImage *)scale:(UIImage *)image toSize:(CGSize)size
{
    ...
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    ...
    return scaledImage;
}

UIGraphicsGetImageFromCurrentImageContext会返回自动释放的图片,scale:toSize:也是如此。因此,你的循环不会泄漏。

您的第一个线索可能是名称:scale:toSize:。根据{{​​3}},只有名称以" alloc"," new"," copy"或" mutableCopy"返回您拥有的对象。其他方法返回您不拥有的对象。