Проведя отлаженные от этого времени годы, я очень хочу понять, что именно происходит!Объективные копии сигнатуры метода C
В очень надуманный пример, скажем, у нас есть два объекта, Object1 имеет этот метод:
- (void) testMethod:(NSString *)testString
Объект 2 имеет этот метод:
- (void) testMethod:(NSArray *)testArray
Затем обратно в Object1, в методе есть следующий код:
NSArray *myArray = [[NSArray alloc] init];
[[[Object2 alloc] init] testMethod:myArray];
Whe п я компилирую, Xcode дает предупреждение:
Несовместимые типы указателей отправки «NSArray *» для параметра типа «NSString *»
Я считаю, что я прав, говоря, предупреждение происходит потому, что я никогда не указывать тип объекта Object2. Явное литье объекта Object2 фиксирует это, но мои вопросы таким образом:
- При вызове TestMethod на Object2, почему это с помощью метода из Object1, когда объектов нет ничего общего друг с другом?
- Почему предупреждение исчезает, если я перемещаю
#import "Object2.h"
в Object1.h вместо Object1.m?
Спасибо!
+1 особенно для описательного метода name advice – JeremyP
Спасибо, ваше вращение по кругу аналогично, в основном говоря, что поведение Objective C просто неопределено, когда нет явного типа приведения? Это объясняет, почему перемещение #import изменило поведение. –
@Tom Gilder: Да. Это не неопределенное поведение в традиционном смысле C, но оно также не определяется каким-либо полезным способом. Вот почему перемещение импорта будет иметь значение, хотя нет очевидной причины, почему это произойдет. – Chuck