обновление данных объекта-одиночки в объекте c - PullRequest
1 голос
/ 29 января 2010

вот код

+ (SalesCollection*)sharedCollection {
@synchronized(self) {
    if (sharedInstance == nil) {
        [[self alloc] init]; // assignment not done here
    }
}
return sharedInstance;

}

+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
    if (sharedInstance == nil) {
        sharedInstance = [super allocWithZone:zone];
        return sharedInstance;  // assignment and return on first allocation
    }
}
   return nil; //on subsequent allocation attempts return nil
}
 - (id)copyWithZone:(NSZone *)zone {
     return self;
}
 - (id)retain {
  return self;
 }

- (unsigned)retainCount {
    return UINT_MAX;  //denotes an object that cannot be released
 }

- (void)release {
 /* Problem in Here */
    [myDict release];
sharedInstance = nil;
[sharedInstance release];
 }

 - (id)autorelease {
  return self;
 }

 // setup the data collection
  - init {
if (self = [super init]) {
    [self setupData];
}
return self;
  }

и вот мой .h файл

@interface MyCollection : NSObject {
NSMutableDictionary *myDict;
}

@property (nonatomic,retain) NSMutableDictionary * myDict;
+ (MyCollection*)sharedInstance ;
- (void)setupData;

и у меня есть один NSMutableDictionary (myDict) , который содержит массив объектов. Теперь моя проблема заключается в том, что я хочу обновить эти данные по нажатию кнопки. поэтому я освобождаю этот экземпляр в методе - (void) release , затем попробуйте снова выполнить Init, но это создает множество утечек, поскольку, возможно, он не освобождает массив объектов из myDict так как этого добиться. Я следую тому же примеру "TheElement" от Apple, чтобы создать синглтон.

Спасибо

Ответы [ 3 ]

1 голос
/ 29 января 2010

Если вы хотите избавиться от предупреждений анализатора кода, сделайте следующее:

static SalesCollection gSharedSalesCollection = NULL;

+ (id) sharedCollection {
    @synchronized(self) {
        if (gSharedSalesCollection == nil) {
            gSharedSalesCollection = [[self alloc] init];
        }
    }
    return gSharedSalesCollection;
}

И есть обычные методы init и dealloc. Таким образом, вы можете использовать класс как синглтон (путем доступа к нему с помощью sharedCollection) или использовать его как не синглтон, например, в модульных тестах с обычным стилем alloc / init / release.

1 голос
/ 29 января 2010

Вы должны придумать какой-то другой способ обновить объект, а не выпустить его. Весь смысл синглтона в том, что может быть только один, и больше никогда не будет создано. Непонятно, что такое myDict, но если это переменная экземпляра, возможно, вы могли бы добавить такой метод:

- (void) refresh {
    [myDict release];
    myDict = nil;
    [self setupData];
}
0 голосов
/ 30 января 2010

я нашел способ ... вот что я делал

[self performSelectorInBackground:@selector(refreshData:) withObject:overlayView];

тогда я завершаю refreshData в autoreleasepool, как это

NSAutoreleasePool *arPool = [[NSAutoreleasePool alloc] init];
[[MyCollection sharedCollection] refresh];
[arPool release];

и вдруг все утечки сработают .. это работает как обаяние ..... (:)))))

...