我正在尝试打印(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]])
我没有收到此错误。
可能出现什么问题?
提前致谢。
答案 0 :(得分:2)
两个评论:
[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;
如果你是。