在“init”中初始化的对象无法在“viewDidLoad”中访问
问题描述:
我有一个奇怪的问题:我在“init”方法中加载对象数据。当我尝试在“viewDidLoad”中访问它时,我的应用程序崩溃。以下是代码:在“init”中初始化的对象无法在“viewDidLoad”中访问
@interface UploadCenterViewController() {
NSMutableArray *videos;
}
@end
@implementation UploadCenterViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
if (![self loadVideos]) {
[self saveVideos];
}
}
return self;
}
-(void)saveVideos {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *encodedData = [NSKeyedArchiver archivedDataWithRootObject:videos];
[defaults setObject:encodedData forKey:@"VIDEOS"];
[defaults synchronize];
}
-(bool)loadVideos {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *encodedData = [defaults objectForKey:@"VIDEOS"];
if (encodedData) {
videos = (NSMutableArray *)[NSKeyedUnarchiver unarchiveObjectWithData:encodedData];
NSLog(@"array size: %d", [videos count]);
return true;
} else {
videos = [[NSMutableArray alloc] init];
return false;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%d", [videos count]);
}
加载数据时,“videos”数组包含一个对象。当在“viewDidLoad”中访问它时,整个应用程序崩溃。
有没有人有想法?
答
将videos
声明为@property
并将其作为self.videos
随处使用。崩溃的原因在于,一旦为其分配了值,videos
就会被释放。 videos
的范围仅在该方法内,因此可能会导致崩溃。既然你想在这个方法之外使用它,你需要保留它,你可以使用@property来实现这一点,如下所述。
的如: -
@interface UploadCenterViewController() {}
@property(nonatomic, strong) NSMutableArray *videos;
@end
-(void)saveVideos {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *encodedData = [NSKeyedArchiver archivedDataWithRootObject:self.videos];
[defaults setObject:encodedData forKey:@"VIDEOS"];
[defaults synchronize];
}
-(bool)loadVideos {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *encodedData = [defaults objectForKey:@"VIDEOS"];
if (encodedData) {
self.videos = (NSMutableArray *)[NSKeyedUnarchiver unarchiveObjectWithData:encodedData];
NSLog(@"array size: %d", [self.videos count]);
return true;
} else {
self.videos = [[NSMutableArray alloc] init];
return false;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%d", [self.videos count]);
}
+1
谢谢。很棒。 – bashan 2013-03-08 23:02:13
看起来内存管理相关的问题。使用@property作为'videos'并将其用作'self.videos'而不是'videos'。这将解决这个问题。 – iDev 2013-03-08 22:55:39