Replace wxNSTimerData -setTimer method with -initWithWxTimer: initializer
which correctly calls the superclass (NSObject) init. Add an -init method for correctness; technically not needed as it is never called but it's an Objective-C best practice. Release the wxNSTimerData instance just after passing it to the NSTimer factory method. NSTimer retains it and we don't keep a pointer to it so we should not keep a refence to it. This fixes the bug in wxTimer::Stop where the program crashes in the NSCFTimer userInfo method because the NSTimer has already been invalidated. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35941 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
// Name: src/cocoa/timer.mm
|
// Name: src/cocoa/timer.mm
|
||||||
// Purpose: wxTimer for wxCocoa
|
// Purpose: wxTimer for wxCocoa
|
||||||
// Author: Ryan Norton
|
// Author: Ryan Norton
|
||||||
// Modified by:
|
// Modified by: David Elliott
|
||||||
// Created: 2005-02-04
|
// Created: 2005-02-04
|
||||||
// RCS-ID: $Id$
|
// RCS-ID: $Id$
|
||||||
// Copyright: (c) Ryan Norton
|
// Copyright: (c) Ryan Norton
|
||||||
@@ -54,16 +54,28 @@ IMPLEMENT_CLASS(wxTimer, wxTimerBase)
|
|||||||
wxTimer* m_timer;
|
wxTimer* m_timer;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id)setTimer:(wxTimer*)theTimer;
|
- (id)init;
|
||||||
|
- (id)initWithWxTimer:(wxTimer*)theTimer;
|
||||||
- (wxTimer*)timer;
|
- (wxTimer*)timer;
|
||||||
@end // interface wxNSTimerData : NSObject
|
@end // interface wxNSTimerData : NSObject
|
||||||
|
|
||||||
@implementation wxNSTimerData : NSObject
|
@implementation wxNSTimerData : NSObject
|
||||||
- (id)setTimer:(wxTimer*)theTimer;
|
- (id)init
|
||||||
{
|
{
|
||||||
|
if(!(self = [super init]))
|
||||||
|
return nil;
|
||||||
|
m_timer = NULL;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)initWithWxTimer:(wxTimer*)theTimer;
|
||||||
|
{
|
||||||
|
if(!(self = [super init]))
|
||||||
|
return nil;
|
||||||
m_timer = theTimer;
|
m_timer = theTimer;
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (wxTimer*)timer
|
- (wxTimer*)timer
|
||||||
{
|
{
|
||||||
return m_timer;
|
return m_timer;
|
||||||
@@ -100,12 +112,14 @@ bool wxTimer::Start(int millisecs, bool oneShot)
|
|||||||
|
|
||||||
wxAutoNSAutoreleasePool thePool;
|
wxAutoNSAutoreleasePool thePool;
|
||||||
|
|
||||||
|
wxNSTimerData *userInfo = [[wxNSTimerData alloc] initWithWxTimer:this];
|
||||||
m_cocoaNSTimer = [[NSTimer
|
m_cocoaNSTimer = [[NSTimer
|
||||||
scheduledTimerWithTimeInterval: millisecs / 1000.0 //seconds
|
scheduledTimerWithTimeInterval: millisecs / 1000.0 //seconds
|
||||||
target: wxTimer::sm_cocoaDelegate
|
target: wxTimer::sm_cocoaDelegate
|
||||||
selector: @selector(onNotify:)
|
selector: @selector(onNotify:)
|
||||||
userInfo: [[wxNSTimerData alloc] setTimer:this]
|
userInfo: userInfo
|
||||||
repeats: oneShot == false] retain];
|
repeats: oneShot == false] retain];
|
||||||
|
[userInfo release];
|
||||||
|
|
||||||
return IsRunning();
|
return IsRunning();
|
||||||
}
|
}
|
||||||
@@ -114,9 +128,8 @@ void wxTimer::Stop()
|
|||||||
{
|
{
|
||||||
if (m_cocoaNSTimer)
|
if (m_cocoaNSTimer)
|
||||||
{
|
{
|
||||||
NSObject* theUserInfo = [m_cocoaNSTimer userInfo];
|
// FIXME: Is this safe to do if !isValid ?
|
||||||
[m_cocoaNSTimer invalidate];
|
[m_cocoaNSTimer invalidate];
|
||||||
[theUserInfo release];
|
|
||||||
[m_cocoaNSTimer release];
|
[m_cocoaNSTimer release];
|
||||||
m_cocoaNSTimer = NULL;
|
m_cocoaNSTimer = NULL;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user