0

コードで次のメソッドを使用しています。

- (NSMutableArray *) newOrderedArray:(NSMutableArray *)array ByKey:(NSString *)key ascending:(BOOL)ascending {

    NSSortDescriptor *idDescriptor = [[NSSortDescriptor alloc] initWithKey:key ascending:ascending];

    NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor];
    NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors];

    [idDescriptor release];

    NSMutableArray *result = [NSMutableArray arrayWithArray:orderArray];

    return result;
}

これはうまくコーディングされた便利な方法ですか?私が思うに、それは自動リリースされたNSMutableArrayを返します。

このメソッドは別のメソッドによって呼び出されます。

- (id) otherMethod {

    NSMutableArray *otherResult = [[[NSMutableArray alloc] initWithCapacity:[otherArray count]] autorelease];

   // I add some stuff to otherResult and then...

    NSMutableArray *result = [dbUtils newOrderedArray:otherResult ByKey:@"objectId" ascending:NO];
    return result;
}

このメソッド(otherMethod)は、返された配列を格納し、ViewControllerの割り当てを解除するときに解放したいViewControllerで呼び出されます。ただし、このビューコントローラで[結果の保持]が呼び出されると(使用可能にする必要があり、割り当てを解除できないため)、次のエラーが発生します。

[CFArrayリリース]:割り当て解除されたインスタンスに送信されたメッセージ

[result retainCount]保持を呼び出す直前にログに記録しようとしましたが、「1」と出力されます。保持を呼び出すときにエラーがスローされる理由がわかりません。

ありがとうございました、

A

4

3 に答える 3

0

これを試して:

    NSMutableArray *otherResult = [[NSMutableArray initWithCapacity:[otherArray count]];

initWithCapacityは自動解放された配列を返すためです。ここで、Autoreleasepoolにアレイを2回解放するように指示します。

于 2010-03-19T17:05:50.397 に答える
0

上記のコードに技術的な問題は見られません。自動リリースされたものotherMethodが返されるはずNSMutableArrayです。保持を呼び出すときにエラーが発生してもよろしいですか?ある時点で、保持するのではなく、誤ってリリースを送信している可能性があります。

様式的には、タイトルに「new」が含まれるメソッドは常に自動解放されないオブジェクトを返す必要があるため、メソッドに別の名前(など)を付けるか、の代わりにorderedArray...使用する必要があります。また、メソッドのシグネチャは大文字で始めてはいけません(そうする必要があります。 [[NSMutableArray alloc] initWithArray:]arrayWithArrayByKeybyKey

于 2010-03-19T17:06:28.980 に答える
0

initWithCapacity:自動解放されたオブジェクトを返しません。–ウェバ

AFAIK initWithCapacityは便利な初期化機能であり、慣例により自動解放されたオブジェクトを返します。したがって、オブジェクトがローカルメソッド内でのみ使用される場合、autoreleasepoolはオブジェクトの割り当てを解除する必要があります。気になりますか?

于 2010-03-19T18:29:54.847 に答える