0

ユーザーがUITableViewの要素をクリックしたときに、2番目のビューを作成しようとしているiPhoneアプリを作成しています。コードは次のようになります

  ReplyToViewController *reply = [[ReplyToViewController alloc] initWithNibName:@"ReplyTo" bundle:nil];
 reply.delegate = self;
 Message *message = [resultData objectAtIndex:indexPath.row];
 int dbid = [message.bizid intValue];
 NSLog(@"dbid=%d",dbid);

 reply.currentMessage = message;
 reply.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
 [self presentModalViewController:reply animated:YES];

応答オブジェクトが適切に作成され、ビューが適切になります。上記のコードセグメントの最後の行は、最終的にReplyToViewControllerのviewDidLoadメソッドを呼び出すフレームワークコードを呼び出します。上記のコードの応答オブジェクトのアドレスとviewDidLoadのオブジェクトのアドレスが同じではありません。

この新しいオブジェクトがどこから来ているのか考えていますか?デバッグするにはどうすればよいですか?また、ReplyToViewControllerに次のメソッドを追加しました。これが呼び出され、この新しいオブジェクトを作成しているユーザーを見つけることができることを期待しています。しかし、それはこの方法で止まりません。

どんな助けでも大歓迎です。

- (id) init
{ 
 /* first initialize the base class */
    self = [super init]; 
 return self;
}

// Following gets called from the 1st code segment.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) 
 {
        // Custom initialization
    }

    return self;
}

- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSLog(currentMessage.text]; // THIS returns nil and the program fails later in the code.
}
4

2 に答える 2

0

これは無関係だと確信していますが、私はこれを理解しています:

NSLog(currentMessage.text];

これでなければなりません:

NSLog(currentMessage.text);

また、コードを分析 (Cmd + Shift + A) すると、潜在的なメモリ リークを追跡し、過剰なメモリ割り当てを防止するのに常に役立つことがわかりました。

于 2010-06-09T15:35:32.513 に答える
0

最も可能性の高い説明は、報告エラーです。

通常、オブジェクトの別のアドレスが表示されるのは、ログ ステートメントで間違った形式記述子を使用したためです。

一般的なエラーは次のとおりです。

NSLog(@"Object address=%i", myObject); // any numerical formatter %d,%f...

...乱数を生成します。あなたが本当に欲しいもの:

NSLog(@"Object address=%%qX",&myObject);

... アドレスを 16 進数でダンプします。

別の間違いは次のとおりです。

NSLog(@"Object address=%%qX",&[myObject description]); 

...毎回変わる記述文字列のアドレスを返します。

他にもありますが、あなたはアイデアを得ます。

ログステートメントを使用している場合は、代わりにデバッガーでアドレスをチェックして、別のオブジェクトであることを確認してください。

無関係ですが、クラスの初期化メソッドはスーパーを呼び出す以外に何もしないため、削除します。カスタマイズしない場合は、コンパイラのデフォルトをスーパーにすることもできます。

于 2010-06-09T15:48:59.330 に答える