2010-10-22 58 views
0

我无法从保存的数据加载符合NSCoding协议的自定义类的实例。我的课有一个UIImage属性,当我分配一个新的UIImage它的程序崩溃与exc_bad_access。exc_bad_access从NSKeyedUnarchiver返回的对象

在视图控制器我宣布我的对象,像这样:

@interface SomeViewController : UIViewController { 
    IBOutlet UIImageView *imageView; 
    SomeClass *myObject; 
} 

@property (nonatomic, retain) SomeClass *myObject; 
@property (nonatomic, retain) IBOutlet UIImageView *imageView; 

然后在.m文件它被用作如下:

@synthesize myObject; 
@synthesize imageView; 

-(void)viewDidLoad{ 
    myObject = [NSKeyedUnarchiver unarchiveObjectWithFile:someDataPath]; 
    imageView.image = myObject.image; 
} 

到目前为止好。但后来我选了一个新的形象,并尝试将其设置为myObject的“图像”属性,至于我可以通过代码单步讲,这将引发一个EXC_BAD_ACCESS

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [picker dismissModalViewControllerAnimated:YES]; 
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
    [imageView setImage:image]; 
    myObject.image = image; 
} 

,它是导致exc_bad_access的最后一行。我究竟做错了什么?

+0

你为什么在didFinishPickingMediaWithInfo设置myObject的:方法? – 2010-10-22 21:10:05

回答

2

您必须保留myObject的:

self.myObject = [NSKeyedUnarchiver unarchiveObjectWithFile:someDataPath]; 
+0

那么在这里使用self.myObject而不仅仅是myObject有什么不同? – 2010-10-22 21:15:49

+0

不同之处在于,调用setter被称为保留对象。如果你不清楚你应该阅读一些Cocoa/Obj-C的介绍。 – 2010-10-22 21:19:48

+0

啊,我明白了。所以我想我应该总是使用self.myObject而不是直接访问它,至少出于分配目的。我会再次阅读Apple的Objective-C文档,也许这次它会坚持下去。 – 2010-10-22 21:27:08