-1
+ (NSString *)getValueforLocale:(NSString*) i18nkey :(NSString*)locale{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSLog(@"paths are : %@",paths);
    NSString *libraryDirectory = [paths objectAtIndex:0];
    NSLog(@"libraryDirectory : %@",libraryDirectory);
    NSString *filePath = [libraryDirectory stringByAppendingPathComponent:@"I8nDB"];
    filePath = [filePath stringByAppendingPathComponent:locale];
    NSLog(@"file path is : %@",filePath);
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath];
    if(fileExists)
    {
        NSDictionary *dict = [[[NSDictionary alloc] initWithContentsOfFile:filePath]autorelease];
        NSDictionary *resourceBundle = [[[NSDictionary alloc] init]autorelease];
        NSString *keyValue = [[[NSString alloc]init]autorelease];
        resourceBundle = [dict valueForKey:@"hash"];
        keyValue=[resourceBundle valueForKey:i18nkey];
        NSLog(@"value for %@ is(container) : %@",i18nkey,keyValue);
        if(keyValue != nil || keyValue != NULL)
        {
            return keyValue;
        }
        else
        {
            NSLog(@"key not found in the container file");
            NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable"
                                                             ofType:@"strings"
                                                        inDirectory:nil
                                                    forLocalization:locale];
            NSLog(@"path for %@ is : %@",locale,path);
            fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
            if(fileExists)
            {
                NSDictionary *dict = [[NSDictionary dictionaryWithContentsOfFile:path]autorelease];
                NSLog(@"value for %@ is(resources) : %@",i18nkey,[dict objectForKey:i18nkey]);
                return [dict objectForKey:i18nkey];
            }
            else
            {
                return NULL;
            }
        }
    }
    else
    {
        NSLog(@"%@ locale does not exist in container",locale);
        NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable"
                                                         ofType:@"strings"
                                                    inDirectory:nil
                                                forLocalization:locale];
        NSLog(@"path for %@ in resources is : %@",locale,path);
        fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
        if(fileExists)
        {
            NSDictionary *dict = [[NSDictionary dictionaryWithContentsOfFile:path]autorelease];
            NSLog(@"value for %@ is : %@",i18nkey,[dict objectForKey:i18nkey]);
            return [dict objectForKey:i18nkey];
        }
        else
        {
            return NULL;
        }
    }
}

如果我们从上面的代码中删除 Autorelease,如果不是应用程序崩溃,它在 iOS7 中工作

我主要担心的是为什么它不会在 iOS8 和 9 中崩溃,而只有在 iOS7 中的崩溃是与这些版本的自动发布相关的变化

4

3 回答 3

0

在您的代码中,您只分配一个字典

NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];

所以你只需要关心它,另一个对象不属于你!所以你不需要释放或自动释放它们。

尝试流动代码

+ (NSString *)getValueforLocale:(NSString*) i18nkey :(NSString*)locale
    {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
        NSLog(@"paths are : %@",paths);
        NSString *libraryDirectory = [paths objectAtIndex:0];
        NSLog(@"libraryDirectory : %@",libraryDirectory);
        NSString *filePath = [libraryDirectory stringByAppendingPathComponent:@"I8nDB"];
        filePath = [filePath stringByAppendingPathComponent:locale];
        NSLog(@"file path is : %@",filePath);
        BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath];
        if(fileExists)
        {
            NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
            //NSDictionary *resourceBundle = [[[NSDictionary alloc] init]autorelease];
            //NSString *keyValue = [[[NSString alloc]init]autorelease];
            NSDictionary *resourceBundle = [dict valueForKey:@"hash"];
            // relese dict here because not use after
            [dict release];
            NSString *keyValue=[resourceBundle valueForKey:i18nkey];
            NSLog(@"value for %@ is(container) : %@",i18nkey,keyValue);
            if(keyValue != nil || keyValue != NULL)
            {
                return keyValue;
            }
            else
            {
                NSLog(@"key not found in the container file");
                NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable"
                                                                 ofType:@"strings"
                                                            inDirectory:nil
                                                        forLocalization:locale];
                NSLog(@"path for %@ is : %@",locale,path);
                fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
                if(fileExists)
                {
                    // NSDictionary *dict = [[NSDictionary dictionaryWithContentsOfFile:path]autorelease];
                    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
                    NSLog(@"value for %@ is(resources) : %@",i18nkey,[dict objectForKey:i18nkey]);
                    return [dict objectForKey:i18nkey];
                }
                else
                {
                    return NULL;
                }
            }
        }
        else
        {
            NSLog(@"%@ locale does not exist in container",locale);
            NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable"
                                                             ofType:@"strings"
                                                        inDirectory:nil
                                                    forLocalization:locale];
            NSLog(@"path for %@ in resources is : %@",locale,path);
            fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
            if(fileExists)
            {
                // NSDictionary *dict = [[NSDictionary dictionaryWithContentsOfFile:path]autorelease];
                NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
                NSLog(@"value for %@ is : %@",i18nkey,[dict objectForKey:i18nkey]);
                return [dict objectForKey:i18nkey];
            }
            else
            {
                return NULL;
            }
        }
    }
于 2016-07-29T07:04:03.813 回答
0

你为什么不使用ARC?那么你就不需要autorelease了......见http://rypress.com/tutorials/objective-c/memory-management

您的问题可能与 ARC 的设置有关。

于 2016-07-29T06:46:55.287 回答
0

在手动引用计数中,需要平衡保留和释放。

NSDictionary *dict = [[[NSDictionary alloc] initWithContentsOfFile:filePath]autorelease];
NSDictionary *resourceBundle = [[[NSDictionary alloc] init]autorelease];

保留和释放是平衡的,因为alloc(与retain, new, copy,一起mutableCopy)返回一个保留实例,并autorelease计为release.

然而,在

NSDictionary *dict = [[NSDictionary dictionaryWithContentsOfFile:path]autorelease];

你有一个过度释放,因为你是autorelease你没有保留的东西。

iOS版本与它完全无关。

于 2016-07-29T21:03:46.650 回答