0

ここに重大な問題があります... カスタム オブジェクトのインスタンス変数を NSLog しようとすると、ECX_BAD_ACCESS が発生します。次の関数は、ViewController で呼び出され、payloadURL から取得された文字列データを保持します。

- (void) initVcardWithData:(NSString *)payload {
  NSLog(@"1. initVcardWithData");
  aVCard = [[vcardItem alloc] initWithPayload:payload];
  VCardViewController *aVCardViewController = [[VCardViewController alloc] initWithVCard:aVCard];
  [self presentModalViewController:aVCardViewController animated:YES];
  [aVCard release];
}

ここまでは順調ですね。initWithWithVCard 関数は次のとおりで、theVCard@ theVCardNimplementation で定義され、(.h) で @property (nonatomic、retain) としても設定されます。

-(id)initWithVCard:(vcardItem *)aVCard {
  if(self = [super init]) {
      theVCard = [aVCard retain];
      theVCardN = [theVCard.PersonName retain];
  }

  NSLog(@"---- vCardViewController :: initWithVcard :: FirstName: %@", theVCard.PersonName.FirstName);
  return self;
}

theVCardNViewControlleraVCardViewController内のオブジェクトにアクセスすると、ViewDidLoadすべてが魅力的に機能します。そのオブジェクトのデータでいくつかのラベルを設定しました。

theVCardN次に、ビューのボタンに接続されている IBAction から呼び出される関数内からインスタンス変数にアクセスしようとすると、デバッガ コンソールで EXC_BAD_ACCESS エラーが発生します。インスタンス変数からデータを取得しようとする関数は次のとおりです。

-(IBAction)addressbookButtonTapped {
NSLog(@"RETAIN COUNT FOR theVCard: %i", [theVCard retainCount]);
NSLog(@"RETAIN COUNT FOR theVCardN: %i", [theVCardN retainCount]);
NSLog(@"Save to Adressbook: %@", theVCardN.FirstName);



//[self dismissModalViewControllerAnimated:YES];
}

NSLog をtheVCardN呼び出す直前の RetainCounter は「1」を出力します。NSLog 行は、デバッガー コンソールで EXC_BAD_ACCESS を返します。

何か案が ?

4

2 に答える 2

1

-retainCount を呼び出さないでください。絶対保持カウントは役に立ちません。

retainCountオブジェクトの絶対保持カウントを返します。実際の値は実装の詳細であり、システム フレームワークが内部で多くのことを実行して、予期しない方法で保持カウントが変更される可能性があるため、完全に制御できないことがよくあります。

デバッグには役に立たず、これらの問題の追跡に特に焦点を当てた豊富なツールがあります。

まず、クラッシュが発生した場合、 backtrace があります。投稿してください。この場合はおそらくそれほど興味深いものではありません、少なくともバックトレースを調べて、どこでどのようにクラッシュしていると思われるかを少なくとも確認してください。

theVCardN.FirstName投稿された証拠から、ガベージに設定されているか、基になる文字列が過剰に解放されているように聞こえます。ゾンビ検出モードをオンにして、そうであるかどうかを確認します。でクラッシュしているためFirstName、 の作成/保存に関連するコードを表示しますFirstName

また、インスタンス変数とメソッドは常に小文字で始める必要があります。 PersonNameあるべきpersonName&FirstNameあるべきですfirstName

于 2010-12-23T16:01:41.313 に答える
0

コードを間違って読んでいるか、クラス構造を誤解している可能性がありますが、ログに記録しているようです:

NSLog(@"Save to Adressbook: %@", theVCardN.FirstName);

上記では、まだ機能していると言っていますが、ログを記録しています:

theVCard.PersonName.FirstName

「PersonName」がありませんか?ログに記録する必要があることを意味します:

NSLog(@"Save to Adressbook: %@", theVCardN.PersonName.FirstName);
于 2010-12-23T13:39:50.650 に答える