0

作成したPhotoViewオブジェクトに埋め込まれた写真の名前を印刷(nslog)しようとしています。2つのviewcontrollersクラスと、UIButtonクラスを拡張して以前のviewcontrollersの1つにグリッドを設定するPhotoViewクラスを作成しました。

PhotoView.hで私は持っています

@interface PhotoView : UIButton
@property (assign, nonatomic) NSString *photoName;
...

PhotoView.mで私は持っています

    self.tag = [[data objectForKey:@"PhotoID"] intValue];
    self.photoName = [data objectForKey:@"PhotoName"];

tagとphotoNameの値を同じファイルに出力すると、すべてが良好に見えます。

PhotoViewをクリックした後、別のクラスからphotoNameの値を出力しようとすると、問題が発生します。

-(void)didSelectPhoto:(PhotoView*)sender
{   
    NSLog(@"%@", [NSString stringWithFormat:@"%@", sender.photoName]);
}

photoViewをクリックすると、EXC_BAD_ACCESSエラーが発生します。

しかし、私がそうするなら

NSLog(@"%@",[NSNumber numberWithInt:sender.tag]])

このエラーは発生しません。

何が間違っている可能性がありますか?

前もって感謝します。

4

1 に答える 1

2

2 つの注意事項:

  1. [NSString stringWithFormat:@"%@", sender.photoName]-いいえ!いいえ!そうしないでください!これは不必要で CPU サイクルを浪費するだけでなく、可読性を大幅に低下させます。文字列がある場合は、このように複製する必要はありません。文字列オブジェクトを直接使用してください。

NSLog(@"%@", sender.photoName);
  1. 実際のエラーは次のとおりです。

@property (assign, nonatomic) NSString *photoName;

私はe。あなたはassign財産を持っているので、その価値を保持していません。文字列オブジェクトがスコープ外になると、割り当てが解除されます (また、そうweakではないため、自動的に に設定されませんnilが、無効なポインターであるガベージ値が保持されるため、クラッシュします)。代わりに書く

@property (retain, nonatomic) NSString *photoName;

ARC を使用していない場合、および

@property (strong, nonatomic) NSString *photoName;

あなたがいる場合。

于 2013-01-14T21:57:04.560 に答える