我正在使用最新的SDK和XCode开发iOS应用程序。
这是一个简单的问题,但我不知道该怎么做,因为我不希望代码中有任何内存泄漏。
我在项目中使用 ARC ,我有以下标题声明:
@interface UserPreferences : NSObject
{
NSUserDefaults* prefs;
}
@property (nonatomic, readonly) NSString* appLanguage;
// More code
- (void) setAppLanguage:(NSString *)appLanguage;
// More code
@end
这就是我实施- (void) setAppLanguage:(NSString *)appLanguage;
的方式。
- (void) setAppLanguage:(NSString *)newAppLanguage
{
[prefs setObject:appLanguage forKey:APP_LANGUAGE_KEY];
appLanguage = [NSString stringWithString:newAppLanguage];
}
appLanguage = [NSString stringWithString:newAppLanguage];
是否正确?
我不知道appLanguage
在设置新值时会有值。
我的代码是否正确?
答案 0 :(得分:1)
您的代码没有任何泄漏; ARC会自动为您appLanguage
释放先前的值。我会写appLanguage = [newAppLanguage copy]
而不是stringWithString:
,但效果是一样的。
答案 1 :(得分:0)
除非你省略了一些代码,否则这将无效......
您已为NSUserDefaults
创建了一个实例变量,但从未使用值对其进行实例化。致电[prefs setObject:appLanguage forKey:APP_LANGUAGE_KEY];
prefs
时,nil.
在某些时候,在使用prefs
之前,您需要执行以下操作:prefs = [NSUserDefaults standardUserDefaults];
如果你已经在其他地方实例化了prefs,那么你仍然会遇到这个逻辑的问题。据推测,您正在尝试将NSUserDefaults更改为传入的新语言。在这种情况下,该方法应该是:
- (void) setAppLanguage:(NSString *)newAppLanguage {
_appLanguage = newAppLanguage; // implicit synchronize will set the ivar as _appLanguage
[prefs setObject:newAppLanguage forKey:APP_LANGUAGE_KEY];
[prefs synchronize];
}
由于_appLanguage
实例变量默认设置为strong
,因此ARC会自动添加必要的release
和retain
代码,以防止内存泄漏。
此外,如果您尝试创建私有的setter方法,请从界面中取出- (void) setAppLanguage:(NSString *)appLanguage;
。如果您没有尝试创建私有设置器,请从属性声明中删除readonly
。