У меня проблема при работе с NSTimer.
Давайте предположим, что у меня есть эта архитектура:
ThreadedClass.m (содержит таймер NSTimer *;)
- (id) init {
if (self = [super init]) {
// do blablabla
[self launchAThread];
}
return self;
}
- (void) launchAThread {
[NSThread detachNewThreadSelector:@selector(selectorToMyThreadFunction)
toTarget:self
withObject:nil];
}
- (void) selectorToMyThreadFunction {
//I do my stuff in here
//Then i relaunch a Timer to call this function
//periodically but it has to be "atomic" so no
//repeating timer since i don't know the time
//this function will take
//I do some [self changeSomething];
[self restartTimer];
//MyThread ends here (and might be recreated by the Timer's bip
}
- (void)restartTimer {
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(restartTimer)
withObject:nil
waitUntilDone:NO];
return;
}
[timer invalidate];
[timer release];
timer = [[NSTimer scheduledTimerWithTimeInterval:interval
target:self
selector:@selector(launchWithTimer:)
userInfo:nil
repeats:NO] retain];
}
- (void) launchWithTimer:(NSTimer *)theTimer {
if (theTimer == timer)
{
[timer release];
timer = nil;
[self launchAThread];
}
else
{
//Nothing to be done in here, a user launch a thread manually
}
}
Итак, давайте предположим, что пользователь класса выделил его и выпустил сразу после него. Мой таймер все еще будет жив и объект тоже (так как таймер выполняет сохранение).
Когда таймер сработает, он будет делать [self launchAThread]
, а затем таймер будет признан недействительным и освободит себя. И он освободит мой объект, который теперь имеет retainCount = 0 ... Предположим, еще раз, что объект освобожден сразу после это приведет к краху, и я ничего не могу сделать, чтобы остановить это, что приходит мне в голову.
Я согласен, это много предположений, но мне интересно знать, если у кого-то уже была эта проблема и как он ее решил.
Спасибо за чтение, и я надеюсь, что я был ясен! :)