0

このコードを使用して、config.plistファイルから本の名前を取得しています。しかし、私のメモリ管理には問題があります。'[dict release]'はアプリを完全に破壊し、終了します。

'[dict release]'が削除されるとコードは機能しますが、私が知る限り、メモリリークが発生します。

bnamesグローバルNSMutableArrayです

私は何が間違っているのですか?

- (NSString *)loadBookname: (NSInteger) bookToLoad {
    bookToLoad = [self bookOrder:bookToLoad];

    //---get the path to the property list file---
    plistFileNameConf = [[self documentsPath] stringByAppendingPathComponent:@"Config.plist"];

    //---if the property list file can be found---
    if ([[NSFileManager defaultManager] fileExistsAtPath:plistFileNameConf]) {
        //---load the content of the property list file into a NSDictionary object---
        dict = [[NSDictionary alloc] initWithContentsOfFile:plistFileNameConf];
        bnames = [dict valueForKey:@"BookNames"];
        [dict release];
    }
    else {
        //---load the property list from the Resources folder---
        NSString *pListPath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
        dict = [[NSDictionary alloc] initWithContentsOfFile:pListPath];
        bnames = [dict valueForKey:@"BookNames"];
        [dict release];
    }
    plistFileNameConf = nil;

    NSString *bookNameTemp;
    bookNameTemp = [bnames objectAtIndex:bookToLoad - 1];
    NSLog(@"bookName: %@", bookNameTemp);
    return bookNameTemp;
}
4

4 に答える 4

3

配列を適切に割り当てる必要があります。

bnames = [[NSArray alloc] initWithArray:[dict valueForKey:@"BookNames"]];

dictが正しいデータ型を返すことを再確認してください。

于 2012-08-24T11:15:04.963 に答える
1

NSDictionaryの割り当て方法に問題はないようです(ただし、[NSDictionary dictionaryWithContentsOfFile:]を使用して、リリースについて心配する必要はありません。

いずれにせよ、問題は[release]ではなく、おそらくリリース前の行にあることをお勧めします。

bnames = [dict valueForKey:@"BookNames"];

a)それはどこに割り当てられますか。割り当てや宣言がどこにも見当たりませんか?b)どのような種類の価値を期待していますか?

それにブレークポイントを置き、あなたが期待するものか何かを手に入れることを確認してください。

于 2012-08-24T11:33:56.077 に答える
0

dictまだ強力なプロパティでない場合は、1つにします。次に、それself.dictに割り当てるときに使用します(そしてリリースを保持します)。

于 2012-08-24T11:14:57.903 に答える
0

この問題のより良い解決策と思われるものを見つけました。これにより、iOSがメモリを管理できるようになります。

//---finds the path to the application's Documents directory---
- (NSString *) documentsPath {
    NSLog(@"Start documentsPath");
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    //  NSLog(@"Found documentsPath 40");
    NSLog(@"End documentsPath");
    return documentsDir;
}

- (NSString *) configPath {
    NSLog(@"Start configPath");
    NSString *plistFileNameConf = [[self documentsPath] stringByAppendingPathComponent:@"Config.plist"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistFileNameConf]) {
        plistFileNameConf = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
    }
    NSLog(@"plistFile: %@",plistFileNameConf);
    NSLog(@"End configPath");
    return plistFileNameConf;
}

以下は、必要に応じて上記のコードを呼び出します。

NSString *Choice;
NSArray *properties;
NSString *errorDesc = nil;
NSPropertyListFormat format;
NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:[self configPath]];
NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
if (!temp) {
    NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
}
Choice = [temp objectForKey:@"Choice"];
properties = [temp objectForKey:Choice];
于 2012-08-30T14:11:44.967 に答える