2012-03-04 4 views
1

私はIOS開発の初心者です。 私はStoryboardを使用してUITableViewを作成しようとしましたが、このアプリケーションを実行すると「プログラム受信信号: 'SIGKILL'」と表示されます。UITableViewの "SIGKILL"エラーを解決する方法(Storyboardを使用してテーブルビューを構築した場合)

ストーリーボード(ARCなし)を使用してテーブルを作成しましたが、実行時に問題があります。ここ は、コード内で与えられた:


#import "MainTableViewController.h" 
@interface MainTableViewController() 
@property (strong, nonatomic) NSMutableArray *myArray; 
@end 

@implementation MainTableViewController 
@synthesize myArray; 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
// Custom initialization 
    } 
return self; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

#pragma mark - View lifecycle 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
myArray = [NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    self.myArray = nil; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
// Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

#pragma mark - Table view data source 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [myArray count]; 
} 

- (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]; 
    } 
    cell.textLabel.text = [myArray objectAtIndex:indexPath.row]; // 这儿出现异常 Program received signal: “SIGKILL” 
    return cell; 
} 

#pragma mark - Table view delegate 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ } 
@end 

enter image description here

を私は、画面上で上下に移動し、このランタイムエラーが発生します。 ゾンビ機能を有効にしました。私は "myArray"がNSZombieオブジェクトであることを発見しました

そして、デバッグを続行します。 と同じ行に別のエラー "EXC_BAD_ACCESS"が見つかりました。 cell.textLabel.text = [myArray objectAtIndex:indexPath.row]; myArrayはまだゾンビオブジェクトです。

どのように解決しますか? ありがとうございました! !

答えて

3

arrayWithObjects:メソッドを使用してmyArrayを作成しました。このメソッドは、所有していないオブジェクトを返します。あなたがそれを所有していないので、次回プログラムが実行ループを通過するときに、オブジェクトが割り当て解除される(ゾンビに変わる)可能性があります。実際には、まさにこれが起こっているのです。

オブジェクトを周りに残したい場合は、そのオブジェクトの所有者になる必要があります。あなたはそれを保持することでそれを行います。あなたがそれを保持できる方法は3つあります。あなたは「カバーの下に」プロパティのセッターメソッドを使用して、ドットシンタックスを使用することができ

[self setMyArray:[NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil]]; 

myArray = [[NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil] retain]; 

か、プロパティのセッターメソッドを使用することができます:あなたは、明示的にそれをretainメッセージを送ることができます(コンパイラによって生成される)

self.myArray = [NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil]; 

プロパティセッターメソッドは、自動的にオブジェクトを保持します。

setterメソッドを使用する代わりに、参照をインスタンス変数に直接置きます。このミスをするのは簡単です。コンパイラは、あなたが異なっあなたの財産を合成する場合は、この間違いをキャッチすることができます:

@synthesize myArray = _myArray; 

あなたがそれを行う場合は、プロパティではなくmyArrayという名前のインスタンス変数の、_myArrayという名前のインスタンス変数に格納されています。だから、明示的に直接インスタンス変数にアクセスするには、名前の前に_を使用する必要があります。

// COMPILE-TIME ERROR! 
myArray = [NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil]; 

// Compiles ok 
_myArray = [[NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil] retain]; 

// Also compiles ok 
self.myArray = [NSMutableArray arrayWithObjects:@"apple",@"orange",@"bananas", nil]; 

あなたはインスタンス変数のすべてについて_接頭辞を使用する場合は、あなたはいつでもあなたはその何かを設定していることを知っています_で始まる場合は、新しい値を保持して古い値を解放することを心配する必要があります。

第3のオブジェクトを保持できる方法は、プロジェクトのARC(Automatic Reference Counting)をオンにすることです。その後、オブジェクトの保持と解放を心配する必要はありません。インスタンス変数を直接使用する場合でも、コンパイラは自動的にオブジェクトを適切なタイミングで保持して解放します。

あなたはARCを使用しないを決定した場合、あなたはルールを理解するまで、あなたは必要は、Cocoa Core Competencies: “Memory Management”を研究します。

+0

これは、これらの種類の質問に対する正式な回答である必要があります。なぜ、私たちは標準的な答えを持っていないのですか? – jrturton

+0

+1:この質問をお気に入りの質問に追加しました。 –

関連する問題