Член синглтон-класса был выпущен как-нибудь? - PullRequest
0 голосов
/ 23 марта 2011

Вот мой Singleton Object.

#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

Где настройки - это NSMutableDictionary.После 4 или 5 доступа к одноэлементному объекту одноэлементный объект выпускает словарь «настройки».Я не могу узнать, где я запрограммировал это неправильно.Я попытался пройти через это, но я так и не нашел точное место, когда объект настроек волшебным образом исчезает.

update Я обновил код, скопированный прямо с веб-сайта Apple.Я также использовал макрос для синглтона.у обоих все еще есть проблемы с настройками nsmutabledictionary.

Update2: я получаю это, когда пытаюсь получить доступ к массиву настроек:

Программа получила сигнал EXC_BAD_ACCESS, Не удалось получить доступ к памяти.Причина: KERN_INVALID_ADDRESS по адресу: 0x59200000 0x0177d09f в objc_msgSend () Об отлаживаемой программе было сообщено, что она находилась в функции, вызываемой из GDB.GDB восстановил контекст до того, что было до вызова.Чтобы изменить это поведение, используйте «set unwindonsignal off». Оценка выражения, содержащего функцию (_NSPrintForDebugger), будет прекращена.

Ответы [ 5 ]

0 голосов
/ 23 марта 2011

Неважно, ребята.Я нашел ошибку.Оказывается, когда вы перевыпускаете объект в NSMutableDictionary (объект настроек) (который, как я думал, я скопировал этот конкретный объект в другой объект, но он оказался указателем на объект в NSMutableDictionary), объект настроек освобождает себятакже?Весь NSMutableDictionary стал недоступным.Человек, который невозможно отладить!

0 голосов
/ 23 марта 2011

Куда вы звоните [[SettingsManager sharedSettingsManager] settings]?
Что вы делаете с возвращенным объектом?

Возможно, у вас есть что-то вроде следующего?

NSMutableDictionary *s = [[SettingsManager sharedSettingsManager] settings];
⋮
[s release];

Если этоВ этом случае вам следует либо сначала отправить -retain объекту (после получения от -settings), либо воздержаться от отправки -release.Или, возможно, вы захотите переписать -settings, чтобы она возвращала автоматически выпущенную копию словаря вместо самого словаря (чтобы не дать вызывающим абонентам изменить его «из-под вас»).

Возможно, вы захотите просмотреть Руководство по программированию управления памятью и его Владение и распоряжение объектами и Методы доступа разделы.

0 голосов
/ 23 марта 2011

Установите точку наблюдения для переменной настроек в вашем отладчике ...

watch settings == nil

, и она остановится, когда / где будет выпущена переменная.

0 голосов
/ 23 марта 2011

Мэтт Галлагер имеет встроенный макрос, основанный на коде Apple, который позволяет очень просто реализовать синглтон. Примерно на полпути вниз по странице в разделе «Singletons in Cocoa» есть ссылка:

http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

0 голосов
/ 23 марта 2011

Синглтоны в Objective-C обычно переопределяют release, чтобы предотвратить это. См. Пример кода в Руководстве по основам какао .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...