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、外側のループの外側に配置します

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

オブジェクトがくっついている理由は、それらが解放されていないためです。self.imageFeatures の宣言が表示されません - これは配列ですか? 機能が配列に配置されている場合、それらが配列に残っているか、配列自体が解放されない限り、それらは解放されません。

C の malloc と (試行された) フリーコールの使用に少し混乱しています。ここに私が気付いていない動機がある可能性が非常に高いですが、あなたが提供したものを考えると、これをどのように書くかは次のとおりです。

    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;

すべての豚機能インスタンスをこの imageFeatures 配列に配置したと仮定すると、それらはその imageFeatures 配列によって保持されます。実行中の dealloc を観察するには、次の 2 つのいずれかを実行する必要があります: 配列から占有機能を削除するか、配列自体を解放する必要があります (これは、ポインターを nil に設定することによって行われます)。

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