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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Supreme
記事: 7
登録日時: 11年前

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

#1

投稿記事 by Supreme » 11年前

はじめまして。

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

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メソッドがあるはずだが見当たらない。



ここでつまづいてます。



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

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

よろしくお願い致します。
最後に編集したユーザー Supreme on 2014年3月23日(日) 11:50 [ 編集 1 回目 ]

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 11年前

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

Supreme
記事: 7
登録日時: 11年前

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

#3

投稿記事 by Supreme » 11年前

h2so5様

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

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

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

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

しひ

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

#4

投稿記事 by しひ » 11年前

オブジェクトにメッセージを送信したとき、対応するメソッドがない場合は親のオブジェクトを辿ります。
なので今回の場合、[self view]としてもViewControllerにはviewメソッドがないので
親であるUIViewControllerのviewメソッドが呼ばれます。

Supreme
記事: 7
登録日時: 11年前

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

#5

投稿記事 by Supreme » 11年前

しひ様

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

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

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

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

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

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

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

#6

投稿記事 by へにっくす » 11年前

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#7

投稿記事 by h2so5 » 11年前

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

コード:

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

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

Supreme
記事: 7
登録日時: 11年前

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

#8

投稿記事 by Supreme » 11年前

h2so5様

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

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

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

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

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

どうか教えていただきたく、お願い致します。
添付ファイル
スクリーンショット 2014-03-29 23.52.49.png

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#9

投稿記事 by h2so5 » 11年前

ViewcontrollerのviewDidLoadの中で自分自身のviewDidLoadを呼び出したら無限ループになりますよ。

Supreme
記事: 7
登録日時: 11年前

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

#10

投稿記事 by Supreme » 11年前

H2so5様

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る