Question about dynamic binding, Objective C and methods

孤者浪人 提交于 2019-12-12 01:35:59

问题


According to Apple's Objective C guide, methods with the same name all use the same selector and that they need to have the same return type as well as parameters.

Then there is something about "static typed" methods being the exception.

So is it that methods with the same name and return type + parameters that share a selector, but if it is only the same name but different return type and/or parameters, it will have a different selector - that if you sent such a message to it ... OK I don't know.


回答1:


A selector represents a method name, not a method signature. In the following example:

- (void)someMethod:(int)intParam;
- (id)someMethod:(float)floatParam;

both methods have the same name (someMethod:) and, consequently, the same selector: @selector(someMethod:).

Suppose you’ve declared the first method in a class called Foo and the second method in a class called Bar. Then:

Foo *foo = …;
Bar *bar = …;

[foo someMethod:42];
[bar someMethod:3.1416f];

are examples of ‘static typed’ method calls since it’s clear to the compiler which method should be used because foo and bar are statically typed.

Now consider the following:

id foobar = …;

[foobar someMethod:42];

Since foobar has type id, which is the generic Objective-C object type, the compiler doesn’t have enough information to decide which method is being called. It’ll pick one of those two methods, which can be dangerous depending on the differences between the return types and parameter types. That’s why Apple recommend that methods that have the same name should have the same signature, too. Matt Gallagher has written a blog post about the pitfalls of weak typing in Objective-C.



来源:https://stackoverflow.com/questions/6608551/question-about-dynamic-binding-objective-c-and-methods

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!