0

我在循环的每次迭代中创建一个对象for。但是从不调用 dealloc 函数。它不应该在每次迭代时发布吗?我正在使用 ARC,并且我已停用 NSZombies。我没有看到任何循环引用。从 xcode 运行内存泄漏工具它不会显示任何泄漏,但是该类的指针内存永远不会被释放并且dealloc调用永远不会完成。知道为什么会发生这种情况吗?

谢谢!

for(int i=0; i<10; i++)
{
    //calculate the hog features of the image
    HogFeature *hogFeature = [self.image obtainHogFeatures];
    if(i==0) self.imageFeatures = (double *) malloc(hogFeature.totalNumberOfFeatures*sizeof(double));

    //copy the features
    for(int j=0; j<hogFeature.totalNumberOfFeatures; j++)
        self.imageFeatures[i*hogFeature.totalNumberOfFeatures + j] = hogFeature.features[j];
}

HogFeature声明如下所示:

@interface HogFeature : NSObject

@property int totalNumberOfFeatures;
@property double *features; //pointer to the features 
@property int *dimensionOfHogFeatures; //pointer with the dimensions of the features

@end

和实施:

@implementation HogFeature

@synthesize totalNumberOfFeatures = _totalNumberOfFeatures;
@synthesize features = _features;
@synthesize dimensionOfHogFeatures = _dimensionOfHogFeatures;

- (void) dealloc
{
    free(self.features);
    free(self.dimensionOfHogFeatures);
    NSLog(@"HOG Deallocation!");
}

@end

最后,对类别obtainHogFeatures内部的调用如下所示:UIImage

- (HogFeature *) obtainHogFeatures
{
    HogFeature *hog = [[HogFeature alloc] init];
    [...]
    return hog;
}
4

2 回答 2

1

您可能希望用一个@autoreleasepool { ... }告诉编译器何时进行处理的内部循环来封闭内部循环,否则只有在控制返回主循环时才会清空池。

for (i = 0; i < 10; i++) {
    @autoreleasepool {
        ...
    }
}

正如CodeFi在评论中指出的那样:这将为循环的每次迭代创建一个新的自动释放池,这将在迭代完成后销毁每个对象,但会使程序做更多的工作。如果你不介意在循环完成之前所有的物体都挂在外面,你可以把@autoreleasepool外循环的外面

@autoreleasepool {
    for (i = 0; i < 10; i++) {
        ...
    }
}
于 2013-03-12T22:58:07.503 回答
0

物体粘在周围的原因是它们没有被释放。我没有看到 self.imageFeatures 的声明 - 这是一个数组吗?如果将特征放入数组中,只要它们保留在数组中或数组本身没有释放,它们就不会被释放。

我对使用 C malloc 和(尝试的)免费调用有点困惑。这里很可能有一个我不知道的动机,但是,鉴于您提供的内容,这就是我将如何编写此代码的方式,如果没有按预期触发 dealloc,我会感到惊讶:

    NSMutableArray *features = [[NSMutableArray alloc] init];

    for (int i = 0; i < 10; i++)
    {
        NSArray *hogFeatureArray = [[self image] obtainHogFeatures];
        for (HogFeature *feature in hogFeatureArray)
        {
            [features addObject:hogFeature];
        } 
    }

    [self setImageFeatures:features];

imageFeatures 属性是:

@property (nonatomic, retain) NSMutableArray *imageFeatures;

假设您已将所有 hog 特征实例放入此 imageFeatures 数组,它们将由该 imageFeatures 数组保留。为了观察你的 dealloc 的作用,需要发生以下两件事之一:你需要从数组中删除一个 hog 特性,或者你需要释放数组本身(这可以通过将指针设置为 nil 来完成):

[self setImageFeatures:nil] // Previously assigned array now released
[[self imageFeatures] removeAllObjects]; // Works alternatively
于 2013-03-12T23:46:36.023 回答