несовместимый тип указателя - PullRequest
2 голосов
/ 25 февраля 2011

У меня есть этот класс:

@interface G2Matrix : NSObject 

...
- (id) initWithArray:(float *)val;
...

@end

Эта строка ниже дает мне предупреждение о том, что первый аргумент метода initWithArray имеет несовместимый тип указателя:

float m[16];
...
G2Matrix* matrix = [[[G2Matrix alloc] initWithArray:m] autorelease];

Если яизмените имя метода на что-то вроде initWithArray1, предупреждение исчезнет.Я знаю, что некоторые объекты в базовых классах имеют метод с тем же именем, но я наследую от NSObject, который не имеет этого метода.Что дает?

Дополнительная информация - я вызываю тот же метод initWithArray из других методов init в классе G2Matrix, но там не вижу предупреждения.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2011

По-видимому, это проблема типа:

Внутри других методов init вы вызываете [self initWithArray:...].self набирается как G2Matrix*.В этом контексте компилятор может полностью определить, какой imp (указатель на функцию C) будет в конечном итоге обрабатывать вызов метода, и правильно определять его сигнатуру (типы аргумента и возвращаемого значения).

Out в обычном коде, [G2Matrix alloc]возвращает id.В этом контексте компилятор может сообщать только селектор метода, который будет связан с imp во время выполнения.Он должен угадать, какой initWithArray: вы имеете в виду, и, как вы можете видеть из предупреждения, он угадывает неправильно, поскольку базовый класс имеет метод initWithArray: с другой сигнатурой.Ваш код все еще работает, компилятор просто не может быть уверен.

Выбор уникального имени для initMethod (initWithFloats: может быть?) - рекомендуемый способ закрыть предупреждение.Другими способами являются: разбить его на две строки;или приведите возвращаемое значение alloc к нужному классу:

G2Matrix *matrix = [G2Matrix alloc];
matrix = [[matrix initWithArray:pointerToFloats] autorelease];
// or
G2Matrix* matrix = [[(G2Matrix *)[G2Matrix alloc] initWithArray:m] autorelease];

Выглядит немного странно, но позволяет вам снова включить флаг компилятора лечить предупреждения-ошибки.

0 голосов
/ 25 февраля 2011

@ tathagata, это потому, что initWithArray - это метод, определенный в классе NSArray, поэтому его нельзя использовать, если вы не подкласс класса NSArray.* PS.Используя метод, я имел в виду переопределить существующий метод для вашей цели, что не очень хорошая идея, вы можете найти примечания по подклассам в документе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...