2

ナビゲーションビューのiPhoneアプリがあります。「name」NSString と「weight」NSNumber を持つ単純なオブジェクトを作成しました。このアプリは、セルをロードするときにクラッシュし続けます。メソッドは次のとおりです。

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

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

// Configure the cell...
factor *toAdd = [factors objectAtIndex:indexPath.row];

cell.textLabel.text = toAdd.name;
cell.detailTextLabel.text = [toAdd.weight stringValue];
    // ^ crashes here...
    // stringByAppendingString:@"%"];

return cell;
}

NSNumber で stringValue メソッドを呼び出すと、コンソールに「割り当て解除されたインスタンスに送信されたメッセージ」が表示されます。なぜこれが起こっているのかわかりません。上記の行は名前に問題なくアクセスでき、[release] ステートメントはありません。

ありがとうございました

編集: これが私の要因の init メソッドです。私は再確認し、重みは (retain,nonatomic) であり、名前と同じように実装で合成されます。

- (id) init{
if( self = [super init] )
{
    weight = [NSNumber numberWithInt:10];
    name = @"Homework";
}
return self;
}
4

2 に答える 2

1

initでプロパティセッターメソッドを使用していません。したがって、オブジェクトは保持されません。

これを試して:

- (id) init{
if( self = [super init] )
{
    self.weight = [NSNumber numberWithInt:10];
    self.name = @"Homework";
}
return self;
}

これらの種類のエラーを回避するには、次のコマンドを使用してプロパティを合成できます。

@synthesize name = _name;
于 2012-06-07T18:32:21.477 に答える
0

プロパティに正常にアクセスできることは、プロパティがまだリリースされているnameかどうかとは関係ありません。weightあなたに告げるのは、あなたfactorが生きていて元気であり、それnameもまた生きていて元気であるということだけです。weightの実装でプロパティを適切に保持していないと思いますfactor

編集:追加されたコードで、それは間違いなくあなたがしていることです。

于 2012-06-07T18:18:26.847 に答える