1

奇妙な問題があります。「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」でアクセスすると、アプリ全体がクラッシュします。

誰かアイデアがありますか?

4

2 に答える 2

3

の結果を保持することをお勧めします[NSKeyedUnarchiver unarchiveObjectWithData:encodedData]

メモリ管理ルールをお読みください。

于 2013-03-08T22:56:42.297 に答える
3

として宣言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]);
}
于 2013-03-08T22:58:16.730 に答える