Несовместимый тип указателя, присваиваемый "ViewController"
У меня есть класс ViewController (возможно, я не должен был так называть этот класс?)
Почему у меня есть предупреждение
Несовместимый тип указателя, назначаемый "ViewController" из "UIViewController" в AppDelegate
Обновить:
на этой линии
self.viewController = [[[myPlugin alloc] getPluginViewController] autorelease];
в AppDelegate.h у меня есть
@class ViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController;
@end
у меня в плагине есть
-(ViewController*) getPluginViewController {
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
return self.viewController;
В ViewController у меня есть
@interface ViewController : UIViewController {
3 ответа
Свойство viewController в вашем делегате приложения, вероятно, имеет тип UIViewController*
и вы пытаетесь назначить объект типа ViewController*
к этому. Вероятно, ваш класс ViewController должен наследоваться от UIViewController.
Есть много других проблем с вашим кодом:
self.viewController = [[[myPlugin alloc] getPluginViewController] autorelease];
Игнорируя назначение, первое сообщение, отправленное объекту сразу после его выделения, должно быть соглашением об инициализации. 99,99% программистов автоматически предполагают, что это ужасная ошибка в вашем коде, независимо от того, ужасная она или нет. Вы должны придерживаться соглашений.
Кроме того, если getPluginViewController
соблюдает правила управления памятью, вы не являетесь владельцем объекта, который он возвращает, поэтому вы не должны автоматически освобождать его.
-(ViewController*) getPluginViewController {
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
return self.viewController;
}
Само по себе это нормально. В Objective-C, по соглашению, метод, начинающийся с "get", предназначен для методов, которые возвращают значения в параметрах указателя. Однако в сочетании с тем, что вы называете, есть несколько проблем:
- утечка исходного выделенного ViewController, потому что этот метод возвращает указатель на другой объект
- исходный выделенный ViewController никогда не инициализируется
- возвращенный ViewController автоматически освобождается дважды.
Обратите внимание на двойное размещение.
Впервые ты размещаешь с [myPlugin alloc]
и звонит getPluginViewController
, Но в getPluginViewController
Вы выделяете и инициализируете новый ViewController
и верни это.
Удалить ссылку ViewController
и другие классы, которые, по вашему мнению, имеют проблемы.
Перейдите к искателю и снова добавьте эти классы, сняв отметку "-copy", если это необходимо.
Очистите проект от меню продукта и запустите.