【问题标题】:Correct way of NSString manipulation (memory management) when passing to methods and using returned Nsstring object传递给方法并使用返回的 Nsstring 对象时正确的 NSString 操作(内存管理)方式
【发布时间】:2014-02-06 10:32:24
【问题描述】:

我有一个单例类,有一个可重用的字符串操作代码,有时会泄漏内存。

-(NSString *)getLocalizedString:(NSString *)key
{
@autoreleasepool
{
    FMDatabase *db=[FMDatabase databaseWithPath:databasePath];
    [db open];
//        NSString *uppercaseValue=[key uppercaseString];
    NSString *uppercaseValue = [[NSString alloc] initWithString:[key uppercaseString]];
    NSString *slashRemoved=[uppercaseValue stringByReplacingOccurrencesOfString:@"/" withString:@" "];
    NSString *spaceRemoved=[slashRemoved stringByReplacingOccurrencesOfString:@" " withString:@"_"];
    NSString *dotRemoved=[spaceRemoved stringByReplacingOccurrencesOfString:@"." withString:@""];
    NSString *collanRemoved=[dotRemoved stringByReplacingOccurrencesOfString:@":" withString:@""];
    NSString *excalmaRemoved=[collanRemoved stringByReplacingOccurrencesOfString:@"!" withString:@""];
    NSString *commaRemoved=[excalmaRemoved stringByReplacingOccurrencesOfString:@"," withString:@""];
    NSString *webaddressRemoved=[commaRemoved stringByReplacingOccurrencesOfString:@"ABCCOM" withString:@"ABC.COM"];
    NSString *value=[db stringForQuery:@"select value from language where name=? AND key=?",[Utils getCurrentLanguage],webaddressRemoved];
    if(value==nil)
    {
        value=key;
    }
    return value;

}

}

用法:

NSString *textString = [[NSString alloc]initWithString:[langmodule getLocalizedString:[[arrSetting objectAtIndex:indexPath.row] objectForKey:@"name"]]];
   [cell.textLabel setText:textString];

[tip setTitle:[langmodule getLocalizedString:[[self.transactionSource objectAtIndex:indexPath.row] valueForKey:@"tip"]] forState:UIControlStateNormal];

*getLocalizedString 方法有时会在 NSString value=[db stringForQuery:@"select value from language where name=? AND key=?",[Utils getCurrentLanguage],webaddressRemoved];

我的+getCurrentLanguage 方法如下所示:

+(NSString *)getCurrentLanguage
 {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];
if([currentLanguage isEqualToString:@"fr"])
{
    currentLanguage=@"french";
}
else if([currentLanguage isEqualToString:@"de"])
{
    currentLanguage=@"german";
}
else if([currentLanguage isEqualToString:@"ja"])
{
    currentLanguage=@"japanese";
}
else if([currentLanguage isEqualToString:@"es"])
{
    currentLanguage=@"spanish";
}
else if([currentLanguage isEqualToString:@"nl"])
{
    currentLanguage=@"dutch";
}
else if([currentLanguage isEqualToString:@"pt"])
{
    currentLanguage=@"portuguese";
}
else if([currentLanguage isEqualToString:@"zh-Hans"])
{
    currentLanguage=@"chinese";
}
else if([currentLanguage isEqualToString:@"ko"])
{
    currentLanguage=@"korean";
}
else if([currentLanguage isEqualToString:@"it"])
{
    currentLanguage=@"italian";
}
else {
    currentLanguage=@"english";
}

return currentLanguage;

}

我的getLocaliztionString 没问题,或者它有内存问题。该项目在ARC上。 谢谢和问候

【问题讨论】:

  • 可能是它的 FMDatabase 有泄漏?你检查了吗?

标签: ios ipad memory-management memory-leaks nsstring


【解决方案1】:

为了在 iphone 中管理本地化,我发现使用 TSLanguageManager 库的最佳方式可以从以下链接中查看:https://github.com/tonisalae/TSLanguageManager

【讨论】:

  • 感谢您的关注。我正在寻找解决方案而不是选项,我们不能,因为当前项目中有很多依赖项,将研究它并在新项目中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 2011-03-20
  • 2013-09-02
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多