2010-10-22 62 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