ページ 11

iOSアプリ開発 self.viewについて

Posted: 2014年3月21日(金) 12:43
by Supreme
はじめまして。

プログラミング初心者です。

iOSの勉強に使っている参考書では下記のコードについて

「ラベルのようなビューを、ウィンドウ(アプリ画面全体)をあらわすビューに追加するには、addSubviewメソッドを使います。ウィンドウをあらわすビューはself.viewで指定できます。」

と解説していますが、self.viewの文法的な意味がわかりません。



【ViewController.h】

コード:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end


【ViewController.m】

コード:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    UILabel *lb;
    
    lb = [[UILabel alloc] init];
    
    [lb setFrame: self.view.bounds];
    lb.text = @"Hello World";
    
    [self.view addSubview:lb]; 
}
@end
ネットで検索した結果、下記のブログが参考になりました。

http://ameblo.jp/xcc/entry-10405196514.html

http://naraobjectivec.wiki.fc2.com/m/wiki/selfについて

しかし、self.view が [self view]というメッセージ送信になっていることは分かったのですが、なぜsuperではなくselfを使うのかがわかりません。

自分の頭の中は下記の通りです


selfは自分自身のインスタンスである



ということは、selfはViewControllerクラスのインスタンスである



self(ViewControllerインスタンス)に対してviewメソッドを実行するようにメッセージを送信しているということは、ViewControllerクラスにviewメソッドがあるはずだが見当たらない。



ここでつまづいてます。



知識不足と理解不足で間違った解釈をしていると思います。

どうか、正しい解釈を教えてください。

よろしくお願い致します。

Re: iOSアプリ開発 self.viewについて

Posted: 2014年3月22日(土) 11:28
by h2so5
Supreme さんが書きました: self(ViewControllerインスタンス)に対してviewメソッドを実行するようにメッセージを送信しているということは、ViewControllerクラスにviewメソッドがあるはずだが見当たらない。
スーパークラスのUIViewControllerクラスにviewメソッドが存在します。

Re: iOSアプリ開発 self.viewについて

Posted: 2014年3月23日(日) 11:59
by Supreme
h2so5様

ご返信いただき、ありがとうございます。

サブクラスであるViewControllerからスーパークラスであるUIViewControllerのviewメソッドを呼び出す場合、super.viewのはずですがself.viewとなっているところがわかりません。

[super viewDidLoad] が何か関係しているのでしょうか?

疑問が解決せずにモヤモヤしているので、どうか教えていただきたく、お願い致します。

Re: iOSアプリ開発 self.viewについて

Posted: 2014年3月24日(月) 03:54
by しひ
オブジェクトにメッセージを送信したとき、対応するメソッドがない場合は親のオブジェクトを辿ります。
なので今回の場合、[self view]としてもViewControllerにはviewメソッドがないので
親であるUIViewControllerのviewメソッドが呼ばれます。

Re: iOSアプリ開発 self.viewについて

Posted: 2014年3月24日(月) 05:04
by Supreme
しひ様

ご回答いただき、ありがとうございました。

self.viewをsuper.view に書き換えても Hello World と表示されました。

しひ様のおっしゃる通り、親であるUIViewControllerまで辿ったのだと思います。

ですが、自身のオブジェクトにviewメソッドが無いのが分かっているのに、どうして最初からsuper.viewとしないのでしょうか。

どうか教えていただきたく、お願い致します。

Re: iOSアプリ開発 self.viewについて

Posted: 2014年3月24日(月) 05:30
by へにっくす
自分はiOSアプリ開発は知りませんが、これだけは言えるかなと思うことを書きます。
Supreme さんが書きました:self.viewをsuper.view に書き換えても Hello World と表示されました。
あなたが確認されたように、
self.viewは自分自身のクラス、親クラス、親の親クラス、・・・の順にメソッド名を探し、
super.viewは親クラス、親の親クラス、・・・の順に探します。
あなたが自分自身のクラスにviewを定義することがないのであれば、どうぞsuper.viewに変えてください。
同じ結果になるのでしたらself.viewにした方が、あとあと自分でviewを定義したときに書き換える必要がないでしょう?
ただそれだけですよ。

Re: iOSアプリ開発 self.viewについて

Posted: 2014年3月24日(月) 07:09
by h2so5
Supreme さんが書きました: ですが、自身のオブジェクトにviewメソッドが無いのが分かっているのに、どうして最初からsuper.viewとしないのでしょうか。
superは1階層上のクラスしか参照できません。
今回のように継承の深さが浅い場合は問題ありませんが、例えばViewControllerをさらに継承したクラスからUIViewControllerまで手動で辿ろうとしても、

コード:

super.super.view
のように書くことはできません。
例え書けたとしても、いちいちUIViewControllerが何階層上にあるのかどうかを意識する必要があります。

self.viewとだけ書けば階層に関係なくアクセスできるので、普通はselfを使うことになります。

Re: iOSアプリ開発 self.viewについて

Posted: 2014年3月30日(日) 00:35
by Supreme
h2so5様

わかりやすく教えていただき、ありがとうございました。

selfは該当メソッドが見つかるまで自身のクラスから順に上位のクラスを検索するとのことなので、superを全てselfに書換え可能なのかと思い、試しに[super viewDidLoad]を[self viewDidLoad]に書換えてみました。

実行してみると、シミュレーターは真っ黒になり、Hello World は表示されませんでした。

また、Xcodeの左エリアがShoe the Debug Navigatorに切り替わり、Thread 1という項目の下に[Viewcontroller viewDidLoad]がズラズラと表示されました。

なぜ、superをselfに書換えできなかったのか理解できません。

どうか教えていただきたく、お願い致します。

Re: iOSアプリ開発 self.viewについて

Posted: 2014年3月30日(日) 07:54
by h2so5
ViewcontrollerのviewDidLoadの中で自分自身のviewDidLoadを呼び出したら無限ループになりますよ。

Re: iOSアプリ開発 self.viewについて

Posted: 2014年3月30日(日) 08:05
by Supreme
H2so5様

無限ループになっていることに気付いていませんでした。

教えていただき、ありがとうございました。

これでスッキリしました。