1

C ベースのコア モジュールを含み、ココア タッチを使用して UI を実装するアプリを開発しています。画面に表示するデータを取得するために c モジュールを呼び出しますが、その後、メモリが解放されないようです。プロファイル ツールを使用してリークを監視しましたが、リークは表示されません。ただし、すべての割り当ての全体のバイト フィールドは、リリース後に減少しません。つまり、操作を何度も繰り返すと、そのたびにメモリが増加し、最終的にアプリがクラッシュします。

これが私が使用したコードです。

In Interface ( ClassA.m file)

-(NSString*) getName:(int) index{
    int len = get_name_len(index);
    char* name = malloc(len); // name[len-1] indicate NULL CHAR
    get_name(name,index,len);
    NSString *result = [NSString stringWithUTF8String:name];
    free(name);
    name = nil;
    return result;
}

In UI (.m file)

@property (nonatomic, retain) NSString* name;

...

-(void) update {
self.name = [ClassA getName:0];
}

...

-(void) dealloc{
self.name = nil;
[super dealloc];
}

私は約100のデータを持っています。self.name = [ClassA getName:0] を呼び出した場合。self.name = nil を呼び出した後、メモリがいくらか増加し、解放されません。次に、self.name = [ClassA getName:1] を呼び出します。また増えます。しかし、同じ self.name = [ClassA getName:0] を何度も呼び出すと、1 回だけ増加します。(この関数を再度呼び出す前に、最初に self.name = nil を呼び出します)。

とても奇妙です。

私も試します:

[ClassA getName:0];
self.name = [NSString* stringWithString@"ABC"];

そして、メモリは正しく解放されます。

これは、self.name と function:getName() のメモリ管理が適切であることを示している可能性があると思います。

どのような問題が考えられますか?

4

1 に答える 1

0

私のコメントに関してフォローアップ...次のものがあります(UI .mファイル内):

@property (nonatomic, reatin) NSString* name;

そのはず:

@property (nonatomic, retain) NSString* name;

キーワードのスペルがretain間違っています。

于 2012-08-03T06:38:42.900 に答える