2011-12-12 8 views
5

iOSプログラミングを学び始めたばかりで、継承に問題があります。 2つのファイルがあります。objective-C(iOS sdk)での継承のしくみ

まずファイル

ヘッダー

#import <UIKit/UIKit.h> 
@interface ViewController : UIViewController { 
    int x; 
} 
@end 

実装:

#import "ViewController.h" 
#import "NewClass.h" 
@implementation ViewController 
#pragma mark - View lifecycle 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    x = 999; 
    NewClass *myClass = [[[NewClass alloc] init] autorelease]; 
} 
@end 

セカンドファイル

ヘッダー:

#import "ViewController.h" 

@interface NewClass : ViewController 
@end 

実装:

私は999にXを設定し、NewClassで、私はそれを取得したいが、私は NSLog(@"%i",x);を呼び出すとき、それは私が作った0

を与えるのViewControllerで

#import "NewClass.h" 
@implementation NewClass 

-(id)init { 
    self = [super init];          
    if (self != nil) {            
     NSLog(@"%i",x); 
    } 
    return self;       
} 
@end 

間違い?

+0

NSCl(@ "%i"、x)をNewClassで呼び出すと、999が表示されます。どのように問題を解決しますか? – KopBob

答えて

8

タイミングに問題があります。

  1. init方法は、(継承階層のすべてのレベルで、ViewControllerNewClass両方におけるように)最初に呼び出されます。これは、値がまだ0のときに値xを印刷するときです。

  2. viewDidLoadメソッドは、ビューコントローラのビューがスーパービューに追加された後の時点で、はるか後で呼び出されます。これは、UIViewControllerクラスに固有の機能です。

あなたの例の仕事をするためには、あなたのNewClassクラス内の1つのように見えるあなたのViewControllerクラスでinit方法を入れて、そこにXを設定します。

また、ViewController内にNewClassインスタンスを作成する必要はありません。NewClassオブジェクトを作成すると、自動的にViewControllerになります。同じように、犬は自動的に動物であり、猫もそうです。あなたが犬を作るとき、あなたは動物をも作りたくありません!

シデイルが言っているように、あなたはおそらく継承がどのように機能するかについてもう少し読んでみるべきです、私は恐れています!

+0

Thx。今それは仕事です) – KopBob

+0

しかし、なぜ私は何をしない場合、私はNewClassでinitメソッドを呼び出すことができますViewController内でNewClassを作成する必要はありません? – KopBob

+0

'[[NewClass alloc] init]'を実行すると、まずNewClassのinitメソッドが呼び出されます。これは、あなたのNSLogコードを実行するためにNewClassに戻る前に、( '' super init ''を実行するので)ViewControllerのinitメソッドを呼び出します。真剣に、もっと多くのOOPチュートリアルを読んでください! –

6

OOPの概念を確認する必要があります。 Object-Oriented Programming with Objective-Cは必須です。

クラスNewClassは実際にはx変数を継承しますが、それは価値がありません。インスタンスを作成すると、その値が親クラスとは関係ない光沢のある新しいインスタンスが作成されます。

クラスのオブジェクトにはxが設定されています。 NewClassは、ViewControllerクラスから継承し、任意のインスタンス(オブジェクト、xを設定します)から継承しません。

+0

Thx!そうです、私はOOPについてもっと知る必要があります。 – KopBob

0

-initが返された後で、-viewDidLoadが正常に呼び出されないためです。スーパークラスは、-initメソッドのような設定を行う必要があります。