我正在尝试打印(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]])


我没有得到这个错误。

可能是什么问题?

提前致谢。

最佳答案

两句话:


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




NSLog(@"%@", sender.photoName);



您的实际错误是这样的:




@property (assign, nonatomic) NSString *photoName;


即您具有assign属性,因此它不会保留其值。当您的字符串对象超出范围时,它会被释放(并且由于它不是weak,所以不会自动设置为nil,但是它将保存无效指针所具有的任何垃圾值,从而导致崩溃)。改写

@property (retain, nonatomic) NSString *photoName;


如果您不使用ARC,并且

@property (strong, nonatomic) NSString *photoName;


如果你是。

关于ios - 将字符串值传递给viewcontroller但获得EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14327432/

10-09 06:29