0

iOSのメモリ管理に関しては間違いなく豊富な情報があります。それについて膨大な量を読んだのですが、特定の状況での「ベスト」プラクティスについてはまだはっきりしていません。以下の2つの例について説明を求めてもらえますか...

tableViewのデータソースとして機能するNSMutableArrayとeditButtonというUIBarButtonItemがあり、どちらも次のように宣言されています。

@interface MyTableViewController : UITableViewController {

   NSMutableArray *datasourceArray;
   UIBarButtonItem *editButton;

}

@property (nonatomic, retain) NSMutableArray *datasourceArray;
@property (nonatomic, retain) UIBarButtonItem *editButton;

@end

次に、それらを合成し、次のように割り当て/初期化しました。

@implementation

@syntesize datasourceArray, editButton;

-(void)viewDidLoad {

self.datasourceArray = [self retrieveDatasourceArray];

self.editButton = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(editTable)];
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:editButton, nil] animated:NO];
[editButton release];

}

-(void)retrieveDatasourceArray {

NSMutableArray *datasource = [[[NSMutableArray alloc] initWithObjects @"example1", @"example2", nil] autorelease];

return datasource;

}

-(void)dealloc {

[datasourceArray release];
[editButton release];
[super dealloc];

}

質問1:NSMutableArray

ご覧のとおり、実際の配列の作成を別の方法に分けました。これは、コアデータから取得して並べ替えが行われているため(この質問では不要)、分離したかったためです。したがって、自動リリースされるNSMutableArrayを返し、これをヘッダーファイルで定義されているself.datasourceArrayに設定することを選択しました。これは、これを実装するための賢明でリークのない方法ですか?

質問2:編集ボタン

後でeditButtonのタイトルとスタイルを変更する必要があるので、それにアクセスする必要があります。したがって、それを宣言します。次に、viewDidLoadメソッドで割り当て/初期化し、配列に追加してから(ここには表示されていない他のいくつかのボタンを使用)、この配列を使用してナビゲーションバーにボタンを追加します。次に、editButtonを割り当てて配列に渡したので、editButtonを解放しました。これは必要または不可欠ですか、それとも私のdeallocメソッドを考えると正しい場所にありますか?

よろしくお願いします

編集:さらなる質問3:

コードの他の場所でこれらのivarのいずれかにアクセスする場合(たとえば、[datasourceArray count]を呼び出す場合、または[編集]ボタンのタイトルを[完了]にリセットする場合、self。notationを使用する必要がありますか?

編集:さらなる質問4:

他の場所では、次のコードを使用して、合成されたNSMutableArrayを初期化しました。以下の答えを考えると、これはもっと漏れやすいですか...?

[self setDatasourceArray: [[NSMutableArray arrayWithArray: [self retrieveDatasourceArray]];
4

1 に答える 1

1

アレイの最初のポイント

NSMutableArray *datasource = [[[NSMutableArray alloc] initWithObjects @"example1", @"example2", nil] autorelease];

return datasource;

ここでは、正しく実行しています。自動解放されたオブジェクトを返します。これは、retain型であると定義したため(実行した場合@property)、変数によって保持されます。

編集ボタンの2点目

self.editButton = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(editTable)];

[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:editButton, nil] animated:NO];

[editButton release];

ここでは、明らかにオブジェクトを解放しすぎています。変数は定義した新しい変数を保持することを忘れないでください。編集ボタンは新しいバーボタンアイテムを保持します。したがって、解放します。これはdeallocで一度行う必要がありますが、ここでリリースするとオーバーリリースにもなります。これを解決するには、リリース行を削除してコードを次のように更新します。

self.editButton = [[[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(editTable)]autorelease];
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:editButton, nil] animated:NO];

ここでは、作成される新しいインスタンスが自動リリースされ、その値が変数によって保持されることがわかります。

于 2012-04-12T09:03:37.317 に答える