0

私のiOSプロジェクトNSArrayでは、整数値を含むことができるを作成しています。このクラスには、そのタスクを実行するいくつかの関数がありますNSArrayNSArrayそこで、そのクラスのプライベート属性として作成しようと思いました。viewDidLoad私はこの配列にメモリを割り当てています。

myArray = [[NSArray alloc] init];

myArrayこのクラスのいくつかのメソッドで使用されます。コードを分析すると、割り当てmyArrayているのに解放していないため、メモリリークが表示されます。

私が書き込みまたは警告がまだそこにある場合[myArray release]。この配列を使用しているクラスの最後のメソッドでリリースした場合、xCodeでは許可されません。deallocviewDidUnloadmyArray

これが私のクラスの.hファイルでそれを宣言する方法です

@interface FightVC : UIViewController
{
    NSArray *myArray;
}

これの可能な解決策を知りたいです。その他、を使用しautoreleaseます。公開したくないので、この配列をプロパティとして記述していません。

前もって感謝します

4

2 に答える 2

2

他の回答で述べたようにプライベート@propertyを使用することは、おそらくこれを行うための最も良くてクリーンな方法です。生のインスタンス変数は、物事を行うための非常に現代的な方法ではありません。ただし、その道を進んでいる場合は、古いivarを解放し、新しいivarを保持するivarのゲッターを実装できます。

- (void)setMyArray:(NSArray *)array {
    [myArray release];
    myArray = [array retain];
}

それはとにかく典型的なパターンです(これはあなたの@propertyために自動的に行うことです)。

その後、配列を作成し、セッターを使用して、オブジェクトを解放できます。

NSArray *newArray = [[NSArray alloc] init];
[self setMyArray:newArray];
[newArray release];

これにより、アナライザーがしゃがむのを防ぐことができます。しかし、いくつかのことが私に突き出ています:

1)[[NSArray alloc] init]あなたがしたいことをする可能性は低いです。空の不変の配列を作成します。NSMutableArrayが必要な場合もあれば、別のイニシャライザを使用してすでに存在するオブジェクトを使用してインスタンス化する場合もあります。

2)NSArraysは、整数自体を保持するのにはあまり適していません。オブジェクトを保持します。を使用するNSPointerArrayか、整数をNSNumbersに入れて。に入れることができますNSArray

于 2013-03-14T06:56:42.480 に答える
0

プロパティを非公開にするには、匿名のカテゴリを作成する必要があります。

.mファイル内:

@interface myClass ()

@property (nonatomic, retain) NSArray *myPrivateArray;

@end

@implementation myClass

// Class code here

@end

配列を解放するには、プロパティをnilに設定するだけです。

self.myPrivateArray = nil;
于 2013-03-14T06:28:19.217 に答える