1

私はまだリークの問題に取り組んでおり、これを解決する方法がわかりません。各arrayTmpaddObject行にリークがあります。

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


[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"Value 1", @"name", nil]];
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"Value 2", @"name", nil]];
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"3", @"value", @"Value 3", @"name", nil]];
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"4", @"value", @"Value 4", @"name", nil]];
//add arrayTmp to an object to use later
[arrayTmp release];
arrayTmp=nil;

arrayTmp= [[NSMutableArray alloc] init];

[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"other value 1", @"name", nil]];
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"other value 2", @"name", nil]];
//add arrayTmp to an object to use later
[arrayTmp release];
arrayTmp=nil;
...

ここに私のFilterクラスのコードがあります

@implementation Filter

@synthesize label;
@synthesize valueIndex;
@synthesize listValue;
@synthesize webServiceFieldName;

-(id) initWithLabel:(NSString *)plabel AndValue:(int)pvalueIndex AndListValue:(NSMutableArray *)plistValue AndWebServiceFieldName:(NSString *)pwebServiceFieldName {

self = [super init];

if (self != nil) {
    self.label = plabel;
    self.valueIndex = pvalueIndex;
    self.listValue = plistValue;
    self.webServiceFieldName = pwebServiceFieldName;

}
return self;
}

@end
4

4 に答える 4

2
//add arrayTmp to an object to use later

これは、arrayTmpをオブジェクトに押し込み、それを保持していることを意味します。切り取られたコードはそれ以外は問題ありませんが、リークはそのメソッド内にあるに違いありません。

arrayTmpとそれを解放するコードを格納するメソッドのコード(ところで、実際には-initWithLabel:value:listValue:webServiceFieldName:Obj-Cの命名規則に従う場合)を投稿します。

Instrumentsでは、ObjectAllocInstrumentを使用して配列インスタンスを表示できるはずです。いずれかをクリックすると、そのアドレスの割り当て/保持/解放/割り当て解除イベントのリストが表示されます。ウィンドウの右側にある[詳細]ペインを展開すると(下部にある小さなボタンを使用して)、特定のイベントのスタックトレースを確認できます。

以下のコードから、初期化子は、tmpArrayで渡されたものを含むivarを次のように設定します。

    self.label = plabel;
    self.valueIndex = pvalueIndex;
    self.listValue = plistValue;
    self.webServiceFieldName = pwebServiceFieldName;

ただし、-deallocメソッドが表示されません。

retainプロパティがまたはのいずれかで宣言されているとするとcopy、deallocは次のようになります。

- (void) dealloc
{
    [label release];
    [listValue release];
    [webServiceFileName release];
    [super dealloc];
}
于 2009-08-18T22:02:34.187 に答える
1

このオブジェクトの割り当てを解除するときは、合成されたメンバー変数を必ず解放する必要があります。これは自動的には実行されません。例えば:

- (void)dealloc
{
    [label release];
    [listValue release];
    [webServiceFieldName release];

    [super dealloc];
}
于 2009-08-18T23:08:54.847 に答える
0

上記のコードでは、aSearchCriteriaとcallを割り当てる行は、結果のを1initSearchFiltersに設定します。次に、retainCountを介してretainCountそのオブジェクトを追加すると、retainCountが2にバンプされます。その時点で、retainCountを1に戻すために呼び出す必要があります。が破棄されると、は0になり、オブジェクトの割り当てが解除されます。追加の呼び出しがないと、は常に1になり、オブジェクトの割り当てが解除されることはなく、リークが発生します。self.searchFiltersaddObject[searchCriteriaTmp release]self.searchFiltersretainCountreleaseretainCount

于 2009-08-19T21:40:02.673 に答える
-1

これらの変更を加えましたが、まだこれらの行に数十のリークがあります。これが私のコードのサンプルです

-(id)initSearchFilters{
    self = [super init];


    if ( self ) {

    //init the search filters array
    self.searchFilters = [[NSMutableArray alloc] init];
    SearchCriteria *searchCriteriaTmp;
    Filter *filterTmp1;
    Filter *filterTmp2;
    NSMutableArray *arrayTmp= [[NSMutableArray alloc] init];

    //Price Range
    arrayTmp = [[NSMutableArray alloc] init];

    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"any", @"value", @"any", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"100", @"value", @"$100", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"200", @"value", @"$200", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"300", @"value", @"$300", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"400", @"value", @"$400", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"500", @"value", @"$500", @"name", nil]];


    filterTmp1 = [[Filter alloc] initWithLabel:@"Minimum Price" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"price_min"];
    filterTmp2 = [[Filter alloc] initWithLabel:@"Maximum Price" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"price_max"];
    searchCriteriaTmp = [[SearchCriteria alloc] initWithFilter1:filterTmp1 AndFilter2:filterTmp2 AndLabelSearchCriteria:@"Price Range" AndEnabled:NO];
    [self.searchFilters addObject:searchCriteriaTmp];
    [arrayTmp release];
    arrayTmp=nil;
    [filterTmp1 release];
    filterTmp1=nil;
    [filterTmp2 release];
    filterTmp2=nil;
    [searchCriteriaTmp release];
    searchCriteriaTmp=nil;

    //Item
    arrayTmp = [[NSMutableArray alloc] init];

    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"item 1", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"item 2", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"3", @"value", @"item 3", @"name", nil]];
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"4", @"value", @"item 4", @"name", nil]];

    filterTmp1 = [[Filter alloc] initWithLabel:@"Item" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"item"];
    searchCriteriaTmp = [[SearchCriteria alloc] initWithFilter1:filterTmp1 AndFilter2:nil AndLabelSearchCriteria:@"Item" AndEnabled:NO];
    [self.searchFilters addObject:searchCriteriaTmp];
    [arrayTmp release];
    arrayTmp=nil;
    [filterTmp1 release];
    filterTmp1=nil;
    [searchCriteriaTmp release];
    searchCriteriaTmp=nil;
    }
    return self;
}

そして私の検索基準クラス

-(id)initWithFilter1:(Filter *)pFilter1 AndFilter2:(Filter *)pFilter2 AndLabelSearchCriteria:(NSString *)pLabelSearchCriteria AndEnabled:(BOOL)pEnabled{

self = [super init];

if (self != nil) {
    self.filter1 = pFilter1;
    self.filter2 = pFilter2;
    self.labelSearchCriteria = pLabelSearchCriteria;
    self.enabled =pEnabled;
}
return self;
}

- (void)dealloc
{
[filter1 release];
[filter2 release];
[labelSearchCriteria release];
[super dealloc];
}
于 2009-08-19T00:03:26.703 に答える