这是我的Singleton对象。
#import "SettingsManager.h"
//#import "SynthesizeSingleton.h"
@implementation SettingsManager
//SYNTHESIZE_SINGLETON_FOR_CLASS(SettingsManager);
static SettingsManager* _sharedSettingsManager =nil;
-(NSString *)getString:(NSString*)value
{
return [settings objectForKey:value];
}
-(NSMutableDictionary*)getSettingsArray
{
return settings;
}
-(int)getInt:(NSString*)value {
return [[settings objectForKey:value] intValue];
}
-(void)setValue:(NSString*)value newString:(NSString *)aValue {
[settings setObject:aValue forKey:value];
}
-(void)setValue:(NSString*)value newInt:(int)aValue {
[settings setObject:[NSString stringWithFormat:@"%i",aValue] forKey:value];
}
-(void)save
{
[[NSUserDefaults standardUserDefaults] setObject:settings forKey:@"ClimbingStrategy"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
-(void)load
{
[settings addEntriesFromDictionary:[[NSUserDefaults standardUserDefaults] objectForKey:@"ClimbingStrategy"]];
}
-(void)logSettings
{
for(NSString* item in [settings allKeys])
{
NSLog(@"[SettingsManager KEY:%@ - VALUE:%@]", item, [settings valueForKey:item]);
}
}
+(SettingsManager*)sharedSettingsManager
{
if(!_sharedSettingsManager)
{
_sharedSettingsManager = [[super allocWithZone:NULL] init];
}
return _sharedSettingsManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
return [[self sharedSettingsManager] retain];
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{
return NSUIntegerMax; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
-(id)init {
settings = [[NSMutableDictionary alloc] initWithCapacity:10];
return [super init];
}
@end
其中settings是NSMutableDictionary。 在对单例对象进行4或5次访问后,单例对象将释放“设置”字典。我无法找到我编程错误的地方。我试过踩过它,但我从来没有找到设置对象神奇消失时的确切位置。
更新 我已经更新了代码,直接从苹果的网站上复制。我也用过单身的宏。两者仍然存在设置nsmutabledictionary的问题。
UPDATE2: 当我尝试访问设置数组时,我得到了这个:
程序收到信号EXC_BAD_ACCESS,无法访问内存。 原因:地址为KERN_INVALID_ADDRESS:0x59200000 objc_msgSend()中的0x0177d09f 正在调试的程序在从GDB调用的函数中发出信号。 GDB已将上下文恢复到调用之前的状态。 要更改此行为,请使用“set unwindonsignal off” 评估包含该函数的表达式(_NSPrintForDebugger)将被放弃。
答案 0 :(得分:0)
Objective-C中的单身人士通常会覆盖release
以防止这种情况发生。请参阅sample code in the Cocoa Fundamentals Guide。
答案 1 :(得分:0)
在调试器中的settings变量上设置观察点...
watch settings == nil
并且当变量被释放时它将停止。
答案 2 :(得分:0)
Matt Gallager有一个基于Apple代码的插入式宏,可以很容易地实现单例。在“可可中的单身人士”部分的页面下方有一段代码链接:
http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
答案 3 :(得分:0)
你在哪里致电[[SettingsManager sharedSettingsManager] settings]
?
你如何处理返回的对象?
你可能有类似下面的内容吗?
NSMutableDictionary *s = [[SettingsManager sharedSettingsManager] settings];
⋮
[s release];
如果是这种情况,那么您应该注意先向对象发送-retain
(从-settings
获取后),或者不要发送-release
。或者,您可能想要重写-settings
,以便它返回字典的自动释放副本而不是字典本身(以防止调用者从“下面”修改它)。
您可能需要查看Memory Management Programming Guide及其Object Ownership and Disposal和Accessor Methods部分。
答案 4 :(得分:0)
没关系。我发现了错误。当你在NSMutableDictionary(设置对象)中过度发布一个对象时(我认为我将该特定对象复制到另一个对象,但事实证明它是指向NSMutableDictionary中对象的指针),设置对象会自行释放还有?整个NSMutableDictionary变得无法访问。那个不可能调试的人!