2012-04-25 3 views
1

У меня есть класс ViewController (возможно, я не должен был назван этот класс так?)Несовместимые указатель типа присвоения «ViewController»

Почему меня есть предупреждение

Несовместимые указатель типа присвоение к 'ViewController' из 'UIViewController' в AppDelegate

Update:

на этой линии

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 

в MyPlugin У меня есть

-(ViewController*) getPluginViewController { 
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; 
    return self.viewController; 

В ViewController У меня есть

@interface ViewController : UIViewController { 
+0

Нет, вы не должны были назвать класс, который. – LuckyLuke

+0

, где вы определили свойство viewController как свойство, можете ли вы добавить этот код? – rishi

+3

в противном случае, если вы хотите удалить это предупреждение, есть работа вокруг - self.viewController = (ViewController *) [[[myPlugin alloc] getPluginViewController] autorelease]; – rishi

ответ

3

Свойство viewController в вашем делете делегата, вероятно, имеет тип UIViewController*, и вы пытаетесь присвоить ему объект типа ViewController*. Вероятно, ваш класс ViewController должен наследовать от UIViewController.

Есть много других проблем с кодом:

self.viewController = [[[myPlugin alloc] getPluginViewController] autorelease]; 

Игнорирование назначение, первое сообщение, отправленное на объект сразу после того, как он был выделен должен быть INIT сообщение по соглашению. 99,99% программистов автоматически предполагают, что это ужасная ошибка в вашем коде, независимо от того, является ли это ужасной ошибкой. Вы должны придерживаться конвенций.

Кроме того, если getPluginViewController соответствует правилам управления памятью, вы не являетесь владельцем объекта, который он возвращает, поэтому вы не должны не должны autorelease.

-(ViewController*) getPluginViewController { 
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; 
    return self.viewController; 
} 

Само по себе это вроде ОК. В Objective-C по соглашению метод, начинающийся с «get», используется для методов, возвращающих значения в параметрах указателя. Тем не менее, положить его вместе с тем, где вы называете его есть несколько проблем:

  • первоначально выделенные утечки ViewController потому, что этот метод возвращает указатель на другой объект
  • оригинала выделяется ViewController никогда не инициированная
  • в возвращенный ViewController дважды автореализован.
+0

Спасибо, я теперь вижу свою ошибку - я никогда не программировал на C, поэтому прыгать непосредственно в Objective C сложно для меня :) – user310291

+0

@ user310291: да это может быть немного крутая кривая обучения, но Objective-C - это хороший язык, как только вы получите его. – JeremyP

1

Обратите внимание на двойной расПредеЛение.

Первый раз, когда вы выделяете [myPlugin alloc] и звоните getPluginViewController. Но в getPluginViewController вы выделяете и инициализируете новый ViewController и возвращаете его.

+0

Я должен уточнить контекст для меня: класс myPlugin - это одно, а myPluginViewController возвращает suview плагина, который не имеет основного вида itsef. В таком случае, по-вашему, что-то не так? Спасибо за помощь. – user310291

-1

Удалить ссылку ViewController и другие классы, в отношении которых у вас есть проблемы.

Перейдите к поиску и добавьте снова эти классы, сняв флажок «-copy» при необходимости.

Очистите проект из меню продукта и запустите.

+0

@caleb kleveter, почему мой ответ downvoted? –

Смежные вопросы