2010-12-07 9 views
0

iPhone Objective-Cの自己質問

- (void)viewDidLoad { 
    NSArray *array = [[NSArray alloc]initWithObjects:@"Pictures",@"Video",@"Text",@"Map",nil]; 
    self.selectionList = array; 
    [array release]; 

    [super viewDidLoad]; 
} 
... 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    NSUInteger row = [indexPath row]; 
    cell.textLabel.text = [selectionList objectAtIndex:row]; 

    return cell; 
} 

私の質問はこれです、なぜのviewDidLoad]セクションで、それだけでselectionList self.selectionListなくする必要がありません?つまり、私たちが作成した配列の内容をselectionList配列に渡すのがポイントです。それでなぜ自己ですか?

+0

プロパティとObjective-Cメモリ管理を読む – nduplessis

+1

サイドノート: 'viewDidLoad'は最初に(最初の行として)親呼び出しを持つ必要があります。 –

+0

@ケビン:違いはしないでください。アップルのドキュメントでは、それはまったくまったく呼ばれません。 – Eiko

答えて

1

「self」を使用すると、setterとgetterのプロパティが使用されます。つまり、プロパティを保持している場合は、releaseになります(セッターはretainを呼び出します)。あなたがセッターを使用しなかった場合、あなたはまた、このように上記の書くことができます(私はそれがプロパティを保持であることを仮定している)(しかし、私はそれをお勧めしません):このインスタンスで

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    selectionList = [[NSArray alloc]initWithObjects:@"Pictures",@"Video",@"Text",@"Map",nil]; 
} 

- (void)dealloc 
{ 
    [sectionList release]; 
    [super dealloc]; 
} 
+2

配列が既に初期化されている、つまり-init – Eiko

+0

の配列がリークします。ええ、配列が初期化されていないと仮定していましたが、これは真です。 –

+1

viewDidLoadは、複数回呼び出すことができます。つまり、メモリ警告の場合です。したがって、手動で行う場合は、新しいリストを割り当てる前に[selectionList release]を実行する必要があります。 – Eiko

0

ここでの違いは、メモリ管理の仕組みです。 @property selectionListがretainとして定義されているとすると、self.selectionList = something;を呼び出すと暗黙のうちに[selectionList retain]が呼び出されます。

この特定の例では、オブジェクトが解放されているため、単にselectionList = something;を実行すると、行がクラッシュする可能性が高くなります。

0

、これはsetterメソッドを使用しているので、self.selectionListである必要があります(ヘッダーのretain属性を持つプロパティーを使用してから、実装のselectionListを合成したものと見なします)。それは事実上同じことです...

[self setSelectionList:array]; 

...それが合理的な場合。

それ以外の場合は、配列をクラスインスタンス変数に割り当てるだけで、それが正しく管理されたことを確認するには、保持と後続のリリースを行う必要があります。

+0

なぜdownvote? (私が見逃したのは何ですか?) –

+0

これは私ではありませんでしたが、私がこの答えで見る唯一の問題は、彼が 'alloc'された記憶を持っているので、実際に保持する必要はありません、ちょうどその後のリリース。彼がここでセッターを使用していた場合、メモリを割り当てることに加えて、彼は二重の保持を持つでしょう。適切なパターンは 'alloc'で、setterを使ってassignを行い、次に元のものを解放します。 –

+0

@Sam - Ah、yup。ヘッドアップありがとう - 私は次回より明確に説明しようとします。 :-) –

1

self.selectionListはインスタンス変数に直接アクセスするのではなく、プロパティ( - > setterメソッド)を使用するためです。これにより、直接的なivarアクセス​​では不可能なこのサブクラスでのこの可変アクセスを上書きすることが可能になります。プロパティの使用は、一般的に、よりクリーンなアプローチ(データカプセル化/情報隠蔽)です。

他のコメントで述べたように:プロパティなしでは、あなたはすべてのポイントでメモリ管理を気にする必要があります、あなたはivarを設定します。この場合、リリースを中止する必要があることを正しく意味します。

1

ratainまたはcopyプロパティにドットシンタックスを使用すると、配列に代入またはコピー(宣言によって異なります)、保持メッセージが得られるようになります生きている、そしてまた重要な - release古い配列は、それが漏れないようにする。

ドット構文を使用しない場合は、これらの手順をすべて手動で行う必要があります。

+0

だから、あなたは私の[配列のリリース]です。ここに電話するのは余計ですか?ドットシンタックスは私にとってそれをしていますか? – startuprob

+0

いいえ、コードはそのままです。リリースはalloc/initのバランスをとっています。メモリ管理ガイドをお読みください - 十分にお勧めできません。それは複数回読む価値があります。 :-) – Eiko