如何在迁移到ARC时解决"没有已知的选择器'executeSelector:withObject:afterDelay:'的实例方法?

ope*_*rog 14 delegates ios automatic-ref-counting performselector

ARC迁移工具在开始迁移之前拒绝接受此代码:

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0];
Run Code Online (Sandbox Code Playgroud)

委托被迫使用协议实现此方法,它应该工作正常:

@protocol OverlayDelegate <NSObject>
- (void)overlayDismissed:(Overlay*)overlay;
@end

@interface Overlay : UIImageView {
    id<OverlayDelegate> delegate;
}

@property (nonatomic, assign) id<OverlayDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

ARC有什么问题?为什么它告诉我"没有已知的选择器实例方法'performSelector:withObject:afterDelay:'?

dtu*_*net 16

ARC并没有造成这种情况 - 它只是暴露它.该方法在NSObject上定义 - 但id不仅仅适用于NSObject(因此你必须比'id'更具体).将您的代码更改为:

@interface Overlay : UIImageView {
    NSObject<OverlayDelegate> *delegate;
}

@property (nonatomic, assign) NSObject<OverlayDelegate> *delegate;
Run Code Online (Sandbox Code Playgroud)