1

私はViewControllerクラスを持っています(おそらく、そのクラスにそのように名前を付けるべきではありませんでしたか?)

警告が表示される理由

AppDelegate の「UIViewController」から「ViewController」に割り当てられている互換性のないポインター型

アップデート:

この行で

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 {
4

3 に答える 3

3

アプリデリゲートのviewControllerプロパティにはおそらくタイプUIViewController*があり、タイプのオブジェクトをそれに割り当てようとしViewController*ています。おそらく、ViewController クラスは UIViewController から継承する必要があります。

コードには他にも多くの問題があります。

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

割り当てを無視すると、オブジェクトが割り当てられた直後にオブジェクトに送信される最初のメッセージは、慣例により init メッセージにする必要があります。99.99% のプログラマーは、恐ろしいバグであるかどうかにかかわらず、これがコードの恐ろしいバグであると自動的に想定します。慣例に固執する必要があります。

また、getPluginViewControllerメモリ管理規則に従っている場合は、それが返すオブジェクトを所有していないため、自動解放し ないでください。

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

それ自体は、これでOKです。Objective-C では、慣例により、"get" で始まるメソッドは、ポインター パラメーターで値を返すメソッド用です。ただし、それを呼び出す場所と組み合わせると、いくつかの問題があります。

  • このメソッドは別のオブジェクトへのポインターを返すため、元の割り当てられた ViewController がリークします。
  • 元の割り当てられた ViewController は初期化されません
  • 返された ViewController は 2 回自動解放されます。
于 2012-04-25T08:11:31.420 に答える
1

二重割り当てには注意してください。

初めて割り当てて[myPlugin alloc]呼び出すgetPluginViewController。ただし、getPluginViewControllernewを割り当てて初期化ViewControllerし、それを返します。

于 2012-04-25T07:34:32.223 に答える
-1

ViewControllerおよび問題があると思われる他のクラスの参照を削除します。

ファインダに移動し、必要に応じて「-copy」のチェックを外してこれらのクラスを再度追加します。

製品メニューからプロジェクトを消去して実行します。

于 2016-01-21T08:20:45.093 に答える