I’m not suggesting you do this as any kind of real solution I just wanted to 
see if it would work, but I was able to ‘hack’ the immutable timer interval, 
perhaps something like this can help you track down what is happening.  I found 
a couple of structs in GitHub for CF source and wondered if it was possible to 
poke at the values.  As I said please don’t think I’m suggesting this as a 
fix...

// found on Github
typedef struct __MYCFRuntimeBase {
    uintptr_t _cfisa;
    uint8_t _cfinfo[4];
#if __LP64__
    uint32_t _rc;
#endif
} MYCFRuntimeBase;

typedef struct __CFRunLoopTimer {
    MYCFRuntimeBase _base;
    uint16_t _bits;
    pthread_mutex_t _lock;
    CFRunLoopRef _runLoop;
    CFMutableSetRef _rlModes;
    CFAbsoluteTime _nextFireDate;
    CFTimeInterval _interval;           /* immutable */
    CFTimeInterval _tolerance;          /* mutable */
    uint64_t _fireTSR;                  /* TSR units */
    CFIndex _order;                     /* immutable */
    CFRunLoopTimerCallBack _callout;    /* immutable */
    CFRunLoopTimerContext _context;     /* immutable, except invalidation */
} MYCFRunloopTimer;

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
    NSTimer *newTimer = [NSTimer timerWithTimeInterval:1.0 // should be 1/sec
            target:self selector:@selector(newData:) userInfo:nil  repeats:YES];
    CFTimeInterval newTimerIntervalFromCF = CFRunLoopTimerGetInterval((__bridge 
CFRunLoopTimerRef) newTimer);

    NSLog(@"CF Timer Interval: %5.2f", newTimerIntervalFromCF);
    NSLog(@"Timer Interval as property: %5.2f", [newTimer timeInterval]);

    // make a hacked version
    MYCFRunloopTimer *myTimer = (__bridge MYCFRunloopTimer *)newTimer;
    NSLog(@"Hacked TimerInterval before hacking it: %5.2f", myTimer->_interval);
    myTimer->_interval = 5.0f;
    NSLog(@"Hacked TimerInterval after hacking it: %5.2f", myTimer->_interval);

    // See if the hacked value was set into the CF struct
    newTimerIntervalFromCF = CFRunLoopTimerGetInterval((__bridge 
CFRunLoopTimerRef) newTimer);

    NSLog(@"After hack CF Timer Interval: %5.2f", newTimerIntervalFromCF);
    NSLog(@"After hack timer Interval as property: %5.2f", [newTimer 
timeInterval]);

    [[NSRunLoop mainRunLoop] addTimer:newTimer forMode:NSRunLoopCommonModes];
}

- (void) newData:(NSTimer *)timer {
    NSLog(@"timer is %@", timer);
}

2020-04-30 00:00:19.372 TestTimer[8777:362408] CF Timer Interval:  1.00
2020-04-30 00:00:19.372 TestTimer[8777:362408] Timer Interval as property:  1.00
2020-04-30 00:00:19.372 TestTimer[8777:362408] Hacked TimerInterval before 
hacking it:  1.00
2020-04-30 00:00:19.372 TestTimer[8777:362408] Hacked TimerInterval after 
hacking it:  5.00
2020-04-30 00:00:19.372 TestTimer[8777:362408] After hack CF Timer Interval:  
5.00
2020-04-30 00:00:19.372 TestTimer[8777:362408] After hack timer Interval as 
property:  5.00
2020-04-30 00:00:20.372 TestTimer[8777:362408] timer is <__NSCFTimer: 
0x7fd1fa45f550>
2020-04-30 00:00:25.373 TestTimer[8777:362408] timer is <__NSCFTimer: 
0x7fd1fa45f550>
2020-04-30 00:00:30.372 TestTimer[8777:362408] timer is <__NSCFTimer: 
0x7fd1fa45f550>
2020-04-30 00:00:35.372 TestTimer[8777:362408] timer is <__NSCFTimer: 
0x7fd1fa45f550>
2020-04-30 00:00:40.371 TestTimer[8777:362408] timer is <__NSCFTimer: 
0x7fd1fa45f550>


> On 29 Apr 2020, at 23:51, Ken Thomases via Cocoa-dev 
> <cocoa-dev@lists.apple.com> wrote:
> 
> Does this happen only when launched from Xcode, or also when launched 
> normally?  Does this happen with a different user account?  Does it happen 
> when run on another Mac?
> 
> -Ken
> 
>> On Apr 29, 2020, at 4:35 PM, Carl Hoefs via Cocoa-dev 
>> <cocoa-dev@lists.apple.com> wrote:
>> 
>> There are no extensions or categories in the project. 
>> I changed the -newData: method name to -arrivalOfNewData:. 
>> I changed the newTimer variable name to theTimer. 
>> I rebooted the machine. 
>> 
>> No joy.
>> 
>> I realize this is no longer a Cocoa problem, but what - even theoretically - 
>> could cause this? 
>> As shown in the debugger, the timer gets created with the wrong time 
>> interval value, by a consistent factor of 20.
>> 
>> -Carl
>> 
>> 
>>> On Apr 29, 2020, at 2:24 PM, Andy Lee <ag...@earthlink.net> wrote:
>>> 
>>> I did the same just now in a macOS project.  Copied your code and added a 
>>> newData: method.  This is with Xcode 11.2.1 on Mojave, 10.4.6.  Works fine 
>>> for me.  Weird!
>>> 
>>> @implementation AppDelegate
>>> 
>>> - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
>>>   NSTimer *newTimer = [NSTimer timerWithTimeInterval:1.0  // should be 1/sec
>>>                                               target:self
>>>                                             selector:@selector(newData:)
>>>                                             userInfo:nil
>>>                                              repeats:YES];
>>>   [[NSRunLoop mainRunLoop] addTimer:newTimer
>>>                             forMode:NSRunLoopCommonModes];
>>> }
>>> 
>>> - (void)newData:(NSTimer *)timer {
>>>   NSLog(@"timer is %@", timer);
>>> }
>>> 
>>> @end
>>> 
>>> 2020-04-29 17:20:45.331469-0400 NSTimerQuestion[21676:3985041] Metal API 
>>> Validation Enabled
>>> 2020-04-29 17:20:46.413190-0400 NSTimerQuestion[21676:3985041] timer is 
>>> <__NSCFTimer: 0x60000370eb80>
>>> 2020-04-29 17:20:47.412968-0400 NSTimerQuestion[21676:3985041] timer is 
>>> <__NSCFTimer: 0x60000370eb80>
>>> 2020-04-29 17:20:48.413525-0400 NSTimerQuestion[21676:3985041] timer is 
>>> <__NSCFTimer: 0x60000370eb80>
>>> 2020-04-29 17:20:49.413373-0400 NSTimerQuestion[21676:3985041] timer is 
>>> <__NSCFTimer: 0x60000370eb80>
>>> 2020-04-29 17:20:50.412610-0400 NSTimerQuestion[21676:3985041] timer is 
>>> <__NSCFTimer: 0x60000370eb80>
>>> ...
>>> 
>>> --Andy
>>> 
>>> On Apr 29, 2020, at 5:15 PM, Alex Zavatone via Cocoa-dev 
>>> <cocoa-dev@lists.apple.com <mailto:cocoa-dev@lists.apple.com>> wrote:
>>>> 
>>>> I used your code in an iOS project and it works as expected.
>>>> 
>>>> 2020-04-29 16:14:02.254107-0500 Timer[83275:13268128] Wed Apr 29 16:14:02 
>>>> 2020
>>>> 2020-04-29 16:14:03.254048-0500 Timer[83275:13268128] Wed Apr 29 16:14:03 
>>>> 2020
>>>> 2020-04-29 16:14:04.253957-0500 Timer[83275:13268128] Wed Apr 29 16:14:04 
>>>> 2020
>>>> 2020-04-29 16:14:05.254170-0500 Timer[83275:13268128] Wed Apr 29 16:14:05 
>>>> 2020
>>>> 2020-04-29 16:14:06.254490-0500 Timer[83275:13268128] Wed Apr 29 16:14:06 
>>>> 2020
>>>> 2020-04-29 16:14:07.254570-0500 Timer[83275:13268128] Wed Apr 29 16:14:07 
>>>> 2020
>>>> 2020-04-29 16:14:08.254651-0500 Timer[83275:13268128] Wed Apr 29 16:14:08 
>>>> 2020
>>>> 2020-04-29 16:14:09.253715-0500 Timer[83275:13268128] Wed Apr 29 16:14:09 
>>>> 2020
>>>> 2020-04-29 16:14:10.254741-0500 Timer[83275:13268128] Wed Apr 29 16:14:10 
>>>> 2020
>>>> 
>>>> I’ll mail you the project offlist.
>>>> 
>>>> 
>>>> 
>>>>> On Apr 29, 2020, at 4:07 PM, Carl Hoefs via Cocoa-dev 
>>>>> <cocoa-dev@lists.apple.com <mailto:cocoa-dev@lists.apple.com>> wrote:
>>>>> 
>>>>> On Apr 29, 2020, at 1:53 PM, Carl Hoefs via Cocoa-dev 
>>>>> <cocoa-dev@lists.apple.com <mailto:cocoa-dev@lists.apple.com>> wrote:
>>>>>> 
>>>>>> On Apr 29, 2020, at 1:43 PM, Steve Mills via Cocoa-dev 
>>>>>> <cocoa-dev@lists.apple.com <mailto:cocoa-dev@lists.apple.com> 
>>>>>> <mailto:cocoa-dev@lists.apple.com <mailto:cocoa-dev@lists.apple.com>>> 
>>>>>> wrote:
>>>>>>> 
>>>>>>> On Apr 29, 2020, at 15:36:23, Carl Hoefs via Cocoa-dev 
>>>>>>> <cocoa-dev@lists.apple.com <mailto:cocoa-dev@lists.apple.com>> wrote:
>>>>>>>> 
>>>>>>>> When I issue NSTimer's +timerWithTimeInterval::::: method, I'm getting 
>>>>>>>> unexpected timer firing times (20X faster than expected).
>>>>>>>> 
>>>>>>>> ∙ If I specify 1.0 for the time interval, my method gets called 20 
>>>>>>>> times/sec. 
>>>>>>>> ∙ If I specify 20.0 for the time interval, my method gets called 1 
>>>>>>>> time/sec.
>>>>>>>> ∙ If I specify 100.0 for the time interval, my method gets called 5 
>>>>>>>> times/sec.
>>>>>>>> ...etc.
>>>>>>>> 
>>>>>>>> Here is my only invocation, called once and nevermore:
>>>>>>>> 
>>>>>>>>  NSTimer *newTimer = [NSTimer timerWithTimeInterval:1.0  // should be 
>>>>>>>> 1/sec
>>>>>>>>                                              target:self
>>>>>>>>                                            selector:@selector(newData:)
>>>>>>>>                                            userInfo:nil
>>>>>>>>                                             repeats:YES];
>>>>>>>>  [[NSRunLoop mainRunLoop] addTimer:newTimer 
>>>>>>>>                            forMode:NSRunLoopCommonModes];
>>>>>>> 
>>>>>>> Sounds like multiple timers are being installed. Set a breakpoint that 
>>>>>>> logs when hit.
>>>>>>> 
>>>>>> 
>>>>>> On break, It's always the same timer. This is with time interval set to 
>>>>>> 20.0:
>>>>>> 
>>>>>> <timer id>                   <interval>       <fire date>
>>>>>> <__NSCFTimer: 0x60000323c600>   1.000000   Wed Apr 29 13:50:40 2020
>>>>>> <__NSCFTimer: 0x60000323c600>   1.000000   Wed Apr 29 13:50:41 2020
>>>>>> <__NSCFTimer: 0x60000323c600>   1.000000   Wed Apr 29 13:50:42 2020
>>>>>> . . .
>>>>>> 
>>>>> 
>>>>> I put a break directly after the creation of the timer, and introspection 
>>>>> already shows the wrong value for the time interval! And since 
>>>>> .timeInterval is a readonly attribute, I cannot force it to the correct 
>>>>> value, nor is there a -setTimeInterval: method.
>>>>> 
>>>>> Argh...
>>>>> -Carl
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> 
>>>>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com 
>>>>> <mailto:Cocoa-dev@lists.apple.com>)
>>>>> 
>>>>> Please do not post admin requests or moderator comments to the list.
>>>>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com 
>>>>> <http://lists.apple.com/>
>>>>> 
>>>>> Help/Unsubscribe/Update your Subscription:
>>>>> https://lists.apple.com/mailman/options/cocoa-dev/zav%40mac.com 
>>>>> <https://lists.apple.com/mailman/options/cocoa-dev/zav%40mac.com>
>>>>> 
>>>>> This email sent to z...@mac.com
>>>> 
>>>> _______________________________________________
>>>> 
>>>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com 
>>>> <mailto:Cocoa-dev@lists.apple.com>)
>>>> 
>>>> Please do not post admin requests or moderator comments to the list.
>>>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com 
>>>> <http://lists.apple.com/>
>>>> 
>>>> Help/Unsubscribe/Update your Subscription:
>>>> https://lists.apple.com/mailman/options/cocoa-dev/aglee%40mac.com 
>>>> <https://lists.apple.com/mailman/options/cocoa-dev/aglee%40mac.com>
>>>> 
>>>> This email sent to ag...@mac.com
>>> 
>> 
>> _______________________________________________
>> 
>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>> 
>> Please do not post admin requests or moderator comments to the list.
>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>> 
>> Help/Unsubscribe/Update your Subscription:
>> https://lists.apple.com/mailman/options/cocoa-dev/ken%40codeweavers.com
>> 
>> This email sent to k...@codeweavers.com
> 
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
> 
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/cocoa-dev/walters%40id.com
> 
> This email sent to walt...@id.com

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to