NSTimer与块 - 我做得对吗?

use*_*914 12 block objective-c automatic-ref-counting

以下是我在NSTimer上的Objective-C类别,用于对NSTimers进行基于块的触发.我看不出它有什么问题,但我得到的是我传入schedule...方法的块正在被解除分配,尽管我要求copy它.

我错过了什么?

typedef void(^NSTimerFiredBlock)(NSTimer *timer);

@implementation NSTimer (MyExtension)

+ (void)timerFired:(NSTimer *)timer 
{
    NSTimerFiredBlock blk = timer.userInfo;
    if (blk != nil) {
        blk(timer);
    }
}

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds 
                                    repeats:(BOOL)repeats 
                                   callback:(NSTimerFiredBlock)blk 
{
    return [NSTimer scheduledTimerWithTimeInterval:seconds
                                            target:self
                                          selector:@selector(timerFired:)
                                          userInfo:[blk copy]
                                           repeats:repeats];
}

@end
Run Code Online (Sandbox Code Playgroud)

Mc.*_*ver 33

我发现这个代码了 http://orion98mc.blogspot.ca/2012/08/objective-c-blocks-for-fun.html

做得好

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.7
      target:[NSBlockOperation blockOperationWithBlock:^{ /* do this! */ }]
      selector:@selector(main)
      userInfo:nil
      repeats:NO
];
Run Code Online (Sandbox Code Playgroud)


Nic*_*nin 8

你在github上有一个项目来完成这项工作!

Cocoapod BlocksKit,允许你阻止一堆类......

#import "NSTimer+BlocksKit.h"
[NSTimer bk_scheduledTimerWithTimeInterval:1.0 block:^(NSTimer *time) {
       // your code
    } repeats:YES];
Run Code Online (Sandbox Code Playgroud)


Bry*_*hen 0

尝试这个

typedef void(^NSTimerFiredBlock)(NSTimer *timer);

@interface NSObject (BlocksAdditions)

- (void)my_callBlock:(NSTimer *)timer;

@end

@implementation NSObject (BlocksAdditions)

- (void)my_callBlock:(NSTimer *)timer {
    NSTimerFiredBlock block = (id)self;
    block(timer);
}

@implementation NSTimer (MyExtension)

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds 
                                    repeats:(BOOL)repeats 
                                   callback:(NSTimerFiredBlock)blk 
{
    blk = [[blk copy] autorelease];
    return [NSTimer scheduledTimerWithTimeInterval:seconds
                                            target:blk
                                          selector:@selector(my_callBlock:)
                                          userInfo:nil
                                           repeats:repeats];
}

@end
Run Code Online (Sandbox Code Playgroud)