2014-11-05 3 views
-1

Я пытаюсь понять, как выглядит подпись метода в Objective-C.Подпись метода в Objective-C

INTRO:

Во-первых, позволяет разорвать недопонимание вопрос, что это, метод подписи? Подпись метода - это нечто, что помогает компилятору однозначно идентифицировать подпрограмму. Я прав? :)

Так на языке C подписи примерно соответствует его определению прототипа: Например, мы имеем функцию int printf(const char *format, ...); в STDLIB. Подпись к этой функции printf. В этом случае мы не можем перегружать в языке C, поскольку компилятор не может определить функцию с различными типами аргументов, поэтому люди решили сделать некоторую хитрую вещь как это:

long int labs (long int n); 
int  abs (int n); 
double fabs (double x); 

В языке С ++, метод Подпись - это имя класса, имя метода и аргументы метода. Итак, на этом языке мы можем перегружать методы.

ПРОБЛЕМА

Я не могу получить простой ответ, что сигнатура метода в Objective-C ?! Я пытаюсь использовать свою логику ...

1) Вначале мы не можем перегружать аргументы метода Objective-C =>, не являясь частью сигнатуры метода.

2) Я пытался компилировать код с другим значением возврата:

@interface Foo : NSObject 
- (CGFloat)method; 
- (NSInteger)method; 
@end 

Я получил сообщение об ошибке в этом случае => возвращаемое значение не является частью сигнатуры метода.


Я тестировал разные случаи, и получил ответ, сигнатура метода в Objective-C является имя класса, метод типа («+» или «-») и селектор. К примеру, у нас есть метод в классе Foo (код ниже):

@interface Foo : NSObject 
+ (void)methodWithArgument:(NSInteger)argument; 
@end 

Так сигнатура этого метода является + [Foo methodWithArgument:]

Но тогда, я смотрю на документацию яблока из NSMethodSignature (http://bit.ly/1tGR8zt)

NSMethodSignature объект запись тип информации для аргументов и возвращаемого значения методы

Аргументы и возвращаемое значение ?! Только используя аргументы и возвращаемое значение, мы можем однозначно идентифицировать метод? Это очень странно.

ответ

3

Подпись метода для разработчиков и для времени выполнения,
Не для компилятора.(Компилятор использует другой метод для понимания подписей)

3

Первое, что нужно. Кто сказал, что компилятор может различать между 2 методами на основе или тип возвращаемого значения

так

@interface Foo : NSObject 
- (CGFloat)method; 
- (NSInteger)method; 
@end 

неправильно. Даже в C или C++ вы не можете перегружать метод на основе его возвращаемого типа. Перегрузка может выполняться на основе типа аргумента или количества аргументов для методов или того и другого.

так над загрузка может быть выполнена таким образом, только

@interface Foo : NSObject 
-(ReturnType)methodNameHere:(int)argument; 
-(ReturnType)methodNameHere:(int)argument secondArgumentDescription:(BOOL)anotherArgument; 
-(ReturnType)methodNameHere; 

компилятор определяет различные методы на основе для числа аргументов и их тип данных

2

вы не можете определить методы, которые имеют такое же имя, но различные типы возврата. Если вы вызываете это, отбрасывая возвращаемое значение, которое нужно вызвать?

@interface Foo : NSObject 
- (CGFloat)method; 
- (NSInteger)method; 
@end 

Foo *foo = [Foo new]; 
[foo method]; // no use for return value here. Which implementation to call?