gpt4 book ai didi

objective-c - 重用 NSMutableArray

转载 作者:行者123 更新时间:2023-12-03 16:49:30 24 4
gpt4 key购买 nike

当我尝试重用现有的 NSMutableArray (为了节省内存)时,我遇到了一些泄漏(由 Instruments 观察到)。

基本上,我正在创建一个 NSMutableArray,用对象(UIImages)填充它,并将其传递给另一个保留它的对象。但是,我现在需要再次使用 NSMutableArray。我想我会释放它的所有对象,清空它,一切都会好起来的,但是 Instruments 从该方法中报告了一个 CALayer 泄漏对象 (??),如下所示:

NSString *fileName;
NSMutableArray *arrayOfImages = [[NSMutableArray alloc] init];

// fill the array with images
for(int i = 0; i <= 7; i++) {
fileName = [NSString stringWithFormat:@"myImage_%d.png", i];
[arrayOfImages addObject:[UIImage imageNamed:fileName]];
}

// create a button with the array
aButton = [[CustomButtonClass buttonWithType:UIButtonTypeCustom]
initWithFrame:someFrame
imageArray:arrayOfImages];

// release its objects
for(int i = 0; i < [arrayOfImages count]; i++) {
[[arrayOfImages objectAtIndex:i] release];
}
// empty array
[arrayOfImages removeAllObjects];

// fill it with other images
for(int i = 0; i <= 7; i++) {
fileName = [NSString stringWithFormat:@"myOtherImage_%d.png", i];
[arrayOfImages addObject:[UIImage imageNamed:fileName]];
}
// create another button with other images (same array)
aSecondButton = [[CustomButtonClass buttonWithType:UIButtonTypeCustom]
initWithFrame:someFrame
imageArray:arrayOfImages];

[arrayOfImages release];

为了清楚起见,我的按钮初始化方法如下所示:

- (id)initWithFrame:(CGRect)frame 
images:(NSArray *)imageArray
{
if(self = [super initWithFrame:frame]) {
myImageArray = [[NSArray arrayWithArray:imageArray] retain];
}
return self;
}

我知道我可以创建一个新的 NSMutableArray 并解决这个问题,但令我烦恼的是不能重用旧数组。可能是什么问题?

最佳答案

I'm getting some leaks (obvserved by Instruments) when trying to reuse an existing NSMutableArray (in order to save memory).

数组占用的内存非常少;每个指针存储 4 个字节(在 32 位系统上)+ 一点点开销。除了最特殊的情况之外,重复使用数组来尝试节省内存都是浪费时间。

// release its objects
for(int i = 0; i < [arrayOfImages count]; i++) {
[[arrayOfImages objectAtIndex:i] release];
}
// empty array
[arrayOfImages removeAllObjects];

您没有保留这些对象,因此,您不应该释放它们!在执行上述操作后,您的应用没有崩溃,这表明您可能在其他地方过度保留了对象。

I know I could just create a new NSMutableArray and be over with this issue but it annoys me not to be able to just reuse the old array. What could be the problem?

该代码中没有任何内容会导致内存泄漏。恰好相反;您过度释放了对象。

以上情况表明您确实需要重新访问 memory management guidelines因为重新使用数组与释放数组并创建一个新数组实际上与此问题没有任何关系。

关于objective-c - 重用 NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2128864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com