将字符串值传递给viewcontroller但获取EXC_BAD_ACCESS

时间:2013-01-14 21:53:27

标签: ios objective-c xcode cocoa

我正在尝试打印(nslog)我创建的PhotoView对象中嵌入的照片的名称。我创建了2个viewcontrollers类,PhotoView类扩展了UIButton类,以填充前一个viewcontrollers中的网格。

在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]])

我没有收到此错误。

可能出现什么问题?

提前致谢。

1 个答案:

答案 0 :(得分:2)

两个评论:

  1. [NSString stringWithFormat:@"%@", sender.photoName] - 不,请!没有!不要这样做! 这不仅是多余的,而且浪费了CPU周期,但它也大大降低了可读性。如果你有一个字符串,你不必像这样复制它,只需直接使用字符串对象:

  2. NSLog(@"%@", sender.photoName);
    
    1. 您遇到的实际错误是:

    2. @property (assign, nonatomic) NSString *photoName;
      

      予。即您有assign属性,因此它不会保留其值。当你的字符串对象超出范围时,它被解除分配(因为它不是weak,它不会自动设置为nil,但它保存无效指针所有的垃圾值,因此崩溃) 。改为写

      @property (retain, nonatomic) NSString *photoName;
      

      如果你没有使用ARC,那么

      @property (strong, nonatomic) NSString *photoName;
      

      如果你是。