objective-c - 内存泄漏、nsmutablearray 和自定义对象

标签 objective-c ios xcode

我曾尝试搜索类似的问题,但没有找到任何好的解决方案。所以我希望有人能帮助我。

基本上我在这个用 Card 对象填充数组的方法中有一个漏洞(tempArray 是在这个循环之上创建和填充的):

for(int i = 0; i < numberOfCards; i += 2) {
    int randomNumber = (arc4random() % [tempArray count]);
    NSNumber *number = [tempArray objectAtIndex:randomNumber];
    [tempArray removeObject:number];

    Card *card1 = [[Card alloc] initWithCategory:category andNumber:[number intValue]];
    Card *card2 = [[Card alloc] initWithCategory:category andNumber:[number intValue]];

    [number release];

    [cards addObject:card1];
    [cards addObject:card2];
}

该方法确实包含了更多的逻辑,但我很确定这个循环包含泄漏。当我使用 Instruments 运行它时,我发现 Card 对象没有被释放。在 dealloc 方法中我确实释放了数组,我以为这也会释放数组内的对象?

-(void) dealloc {
    [cards release];

    [super dealloc];
}

我已经在 card1 和 card2 上尝试过自动释放,试图让它们成为类变量。但似乎没有任何帮助。要么我有泄漏,要么如果我尝试在 card1 或 card2 上添加一个版本,应用程序崩溃。有人知道这里出了什么问题吗?

最佳答案

将每个 Card 对象添加到 cards 后,您需要释放它们。将它们添加到 cards 时,每个对象的保留计数会自动增加。因此添加:

[card1 release];
[card2 release];

之后

[cards addObject:card1];
[cards addObject:card2];

关于objective-c - 内存泄漏、nsmutablearray 和自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6876754/

相关文章:

objective-c - 快速的新手。如何创建或更新 View

ios - 如何根据给定的边界/容器使 UIImageView 具有正方形大小

iphone - 有没有办法使用 xcode/iphone sim 模拟多个 iphone?

ios - self.navigationController?.popViewControllerAnimated 来自 UIAlertController

objective-c - MAC 中的临时文件夹以满足特定要求

iphone - 使用特定长度的随机字节生成 NSData 对象的最佳方法?

ios - 为什么在没有 @autoreleasepool 的 for 循环的每个循环中 NSString autorelease

ios - 在 iOS 中从 Microsoft Health Cloud API 获取用户健康数据

ios - 我可以使用 Xcode 9 打开使用 Xcode 11 创建的项目吗?

ios - 为什么无法捕获此iOS AWS开发工具包网络错误?