【问题标题】:Object with callback block destroyed after init初始化后销毁回调块的对象
【发布时间】:2018-07-24 03:51:05
【问题描述】:

我有这样一个辅助类。

@interface CustomOnScreenshot : NSObject;

@property (copy) void (^finishedCallback)(id sender);

-(instancetype)initWithCallback: (void (^)(id sender))callback;

+(instancetype)onScreenshot:(void (^)(id sender))callback;

@end

@implementation CustomOnScreenshot

-(instancetype)initWithCallback: (void (^)(id sender))callback{
    self = [super init];
    if (self) {
        self.finishedCallback = callback;
        [self subscribeEvent];
    }
    return self;
}

+(instancetype)onScreenshot:(void (^)(id sender))callback{
    CustomOnScreenshot * onScreenShot = [self new];
    [onScreenShot setFinishedCallback:callback];
    return onScreenShot;
}

-(void)subscribeEvent{
    NSLog(@"CustomOnScreenshot subscribeEvent");
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doOnScreenShot:) name:UIApplicationUserDidTakeScreenshotNotification object:nil];
}

-(void)unsubscribeEvent{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationUserDidTakeScreenshotNotification object:nil];
}

-(void)doOnScreenShot: (id)sender{
    if (self.finishedCallback) {
        self.finishedCallback(sender);
    }
}

-(void)dealloc{
    NSLog(@"CustomOnScreenshot dealloc");
    [self unsubscribeEvent];
}

问题是,如果你按预期使用它,那么对象会立即被销毁

- (void)viewDidLoad {
    [super viewDidLoad];
    [CustomOnScreenshot onScreenshot:^(id sender) {
        // CUSTOM code
    }];
}

日志:
CustomOnScreenshot subscribeEvent
CustomOnScreenshot dealloc

只有当我在属性中使用结果时才有效,但我觉得这太过分了

@property (strong, nonatomic) CustomOnScreenshot * customOnScreenshot;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.customOnScreenshot = [CustomOnScreenshot onScreenshot:^(id sender) {
        // CUSTOM code
    }];
}

【问题讨论】:

标签: objective-c automatic-ref-counting objective-c-blocks


【解决方案1】:

如果您没有对CustomOnScreenshot 实例的强引用,那么只要+onScreenshot: 执行完毕,ARC 就会释放该对象。

这就是 @property 修复它的原因。

如果您不想要@property,那么我建议您使用单例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    相关资源
    最近更新 更多