How to resolve “no known instance method for selec

2019-04-19 00:18发布

The ARC migration tool is refusing to accept this code prior to starting with migration:

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0];

The delegate is forced to implement this method with a protocol, and it should work fine:

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

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

@property (nonatomic, assign) id<OverlayDelegate> delegate;

What's wrong with ARC? Why is it telling me that there is "no known instance method for selector 'performSelector:withObject:afterDelay:'?

4条回答
Explosion°爆炸
2楼-- · 2019-04-19 00:39

Simple, your object is of type id and conforms to the NSObject protocol. However, this protocol doesn't declare performSelector:withObject:afterDelay:, so ARC doesn't know what the method is doing and if it must retain anything. Either use an NSObject or cast it prior to making the method call.

查看更多
Ridiculous、
3楼-- · 2019-04-19 00:40

ARC isn't causing this - it is is merely exposing it. That method is defined on NSObject - but id works for more than just NSObject (so you have to be more specific than just 'id'). Change your code to this:

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

@property (nonatomic, assign) NSObject<OverlayDelegate> *delegate;
查看更多
SAY GOODBYE
4楼-- · 2019-04-19 00:42

I've figured out that casting the delegate to NSObject* solves the problem:

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0];

For some weird reason autocompletion did not even come up with -performSelector:withObject:afterDelay: so I had to type it manually. Instead, it offered only -performSelector: and -performSelector:withObject:withObject:

My guess is that it's just stupid to use id as the type for delegates in Objective-C, and I never really knew why everyone including myself is doing that rather than just defining it as NSObject. However, my protocol even told that whoever conforms to that protocol also has to conform to the NSObject protocol by doing this: OverlayDelegate <NSObject> - and still, the compiler didn't get it.

So for now I'm satisfied it works with the cast, but it feels like eating old fish.

查看更多
霸刀☆藐视天下
5楼-- · 2019-04-19 00:47

I met error:

No known class method for selector conformsToProtocol:

The reason is that : file name is not equal to the class name with @interface and @implementation.

查看更多
登录 后发表回答