在“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”中访问它时,整个应用程序崩溃。

有没有人有想法?

+0

看起来内存管理相关的问题。使用@property作为'videos'并将其用作'self.videos'而不是'videos'。这将解决这个问题。 – iDev 2013-03-08 22:55:39

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

您可能想要保留[NSKeyedUnarchiver unarchiveObjectWithData:encodedData]的结果。

阅读memory management rules