iPhone開発ViewControllerのメモリ開放について

このQ&Aのポイント
  • iPhone開発ViewControllerのメモリ開放について質問します。
  • XIBで指定したコントロールに対して、hファイルでアウトレットを宣言した変数はviewDidUnloadでリリースすべきか、deallocでリリースすべきか、どちらが良いのか教えてください。
  • ビューコントローラのdeallocが発生している場合、btn1も開放されているのでしょうか?
回答を見る
  • ベストアンサー

iPhone開発ViewControllerのメモリ開放について

iPhone開発ViewControllerのメモリ開放について iPhone開発ViewControllerの動きについて質問させて下さい。 XIBで指定したコントロールに対して、hファイルでアウトレットを宣言した変数はviewDidUnloadでリリースすべきか、deallocでリリースべきかを教えて頂けないでしょうか。 ただ、これには前提の条件が必要と思いますので、条件を記述いたします。 以下の条件下でどちらが良いのか教えて頂けないでしょうか。理由も合わせてお願いします。 viewDidUnloadに記述すべきと記述している資料が多いような気がしますが、deallocに記述している資料も多いのです。 deallocはおまじないで記述しているだけなのでしょうか? 前提条件 1、Xcodeバージョン3.2.3 2.XCODEの新規のファイルのテンプレートの選択でUIViewController subclassで   Viewとビューコントローラを作成します。 3.アウトレットの宣言   @interface TestView : UIViewController {    UIButton *btn1;   }   @property(nonatomic, retain) IBOutlet UIButton *btn1;   @end      @implementation TestView   @synthesize btn1;   ・・・・   処理   ・・・・   @end 4.TestViewはモーダル表示で、任意の画面から表示します。   TestView *tv = [[TestView alloc] init];   tv.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;   [self presentModalViewController:tv animated:YES];   [tv release]; 5.TestView画面の終了はTestView上のボタン押下で画面が閉じます。   [self.parentViewController dismissModalViewControllerAnimated:YES]; 6.処理中にはメモリ不足によるdidRecieveMemoriWarningは発生しない前提です。 上記の場合、NSLogでイベントの発生を見ると以下のようになります。 2010-08-16 23:42:44.454 MemoryTest[1606:207] TestView - viewDidLoad 2010-08-16 23:42:44.458 MemoryTest[1606:207] TestView - viewWillAppear 2010-08-16 23:42:46.117 MemoryTest[1606:207] TestView - viewWillDisappear 2010-08-16 23:42:46.839 MemoryTest[1606:207] TestView - dealloc didRecieveMemoriWarningが発生しないので、ViewDidUnLoadも発生しません。 ここまでは理解できますが、ViewDidUnLoadのみに[btn1 Release];を記述した場合、btn1は開放されるのでしょうか。 ビューコントローラのdeallocは発生しているので、OKということでしょうか? dealloc内の[super dealloc];XIBに関連するものは全て開放してくれるのでしょうか?それなら記述しなくて良い? それともViewDidUnLoadとbtn1の両方に記述すべきなのでしょうか? ビューコントローラのdeallocが発生しているということは、btn1も開放されているということですか? ビューコントローラのdeallocが発生しているけど、btn1も開放されないこともあるのでしょうか? すみません。次から次への疑問がわきます。多分、この辺の仕組みを理解していないのだと思いますが、いろいろ調べたのですが、納得する答えが見つかりませんでした。 どうかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

> XIBで指定したコントロールに対して、hファイルでアウトレットを宣言した変数はviewDidUnloadでリリースすべきか、deallocでリリースべきかを教えて頂けないでしょうか。 する必要はないし、するべきではない。それが回答です。 「XIB」とお書きになっているのは、「Nibファイル」と、ふつういわれています。ちなみに、Nib = NextStep Interface Builderの略です。当初は、拡張子.nibでしたが、XML形式が導入されたことにより、拡張子が.xibに変わりました。昔からMac OS Xのアプリケーション開発をしている人たちには、「Nibファイル」といったほうが、とおりがいいです。 Nibファイルが生成したインスタンスは、その開放についても、Nibファイルに任せるのが、自然だといえます。 「viewDidUnload」は、Viewインスタンスが解放される直前に実行されるメソッドです。対して「dealloc」は、この場合View Controllerインスタンスが解放される直前に実行されるメソッドです。Viewインスタンス内で生成されたインスタンスは、「viewDidUnload」で開放されるのが、自然だといえます。ViewとView Controllerは、つねにセットなので、Viewインスタンスが解放されるときと、View Controllerインスタンスが開放されるタイミングは、ほぼ同時ですから、どちらで開放しても、不具合が起きるケースは、まれでしょうが。

panda1212
質問者

お礼

お礼が遅れて申し訳ありません。 回答ありがとうございました。 まだまだ勉強不足のようなので、もっと勉強してみます。

関連するQ&A

  • iPhoneアプリ開発(Swift)

    Xcode6(ver6.32)を使用しSwiftでアプリを作成しています。 AppleからのRejectを受け原因を調査したところ あるボタンをタップした際のイベント内にある下記でアプリが落ちるようです。 ちなみにシミュレーター上では落ちませんがデバイスにインストールすると発生します。 var mainViewController: UIViewController =storyboard.instantiateViewControllerWithIdentifier("ViewController") as! UIViewController 2週間ほど悩み続けておりますが解決できておりません。 どなたか原因をご教授ください。

  • iPhone SDK UIViewに追加したUIButtonが反応しな

    iPhone SDK UIViewに追加したUIButtonが反応しない。。。 インターフェイスビルダーにあるUIViewにボタンを追加した場合は、 ちゃんとボタンは反応するんですが、プログラムから追加したUIViewにボタンをおくと UIControlEventTouchUpInsideのイベントに反応しません。 一応、こちらに簡単なプロジェクトもあげておきました。 http://gemic.jp/xcode/buttonOnView.zip 詳細は、下記です。 View-Based Applicationテンプレートで作成したプロジェクト(buttonOnView) buttonOnViewViewController.h #import <UIKit/UIKit.h> @interface buttonOnViewViewController : UIViewController { UIView *theView; } @end ----------------------------------------------------------------- buttonOnViewViewController.m - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor redColor]; UIButton *btn1 = [[UIButton buttonWithType:UIButtonTypeRoundedRect]retain]; [btn1 initWithFrame:CGRectMake(60, 90, 200, 50)]; //このボタンは反応する↓ [self.view addSubview:btn1]; [btn1 setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; [btn1 addTarget:self action:@selector(createView:) forControlEvents:UIControlEventTouchUpInside]; } - (IBAction)createView:(UIButton*)sender { theView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; [theView setBackgroundColor:[UIColor greenColor]]; [self.view addSubview:theView]; UIButton *btn = [[UIButton buttonWithType:UIButtonTypeRoundedRect]retain]; [btn initWithFrame:CGRectMake(60, 150, 200, 50)]; //このボタンは反応しない↓ [theView addSubview:btn]; [btn addTarget:self action:@selector(deleteView:) forControlEvents:UIControlEventTouchUpInside]; } - (IBAction)deleteView:(UIButton*)sender { NSLog(@"touch event reaction"); [theView removeFromSuperview]; } ----------------------------------------------------------------- いろいろググってみたり、DevCenterのドキュメントを探したんですが、 思ったような情報が見つからず相当はまってます。 ネットで探して見つからないってことは、凄く初歩的なことか?? と思ってるんですが、、、 どなたか、助けていただけたらありがたいです。

  • objective-c 画面遷移について

    プログラミングに関して素人です。 UIViewControllerからPushコードを使って別のUIViewに画面遷移したいのですが 遷移先にTableViewを2つ並べております。 画面遷移する際のコードはどのように記述したらいいのでしょうか? 詳しいかたお力お貸しいただければと思います。 ViewController.m - (IBAction)NewsPage:(UIButton *)sender { //こちらの記述方法が不明 } TViewController.h // XibファイルとUIViewの紐づけ。 @property (weak, nonatomic) IBOutlet UITableView *leftTableView; @property (weak, nonatomic) IBOutlet UITableView *rightTableView; - (IBAction)TopButton:(UIButton *)sender; 根本的になにか違えばご指摘お願いします。

  • UIButtonを始点とするフリックの取得について

    iPhoneアプリの開発を行っています。 その中で、あるView(下記ソースではtestView)の中でフリックが行われた場合に 特定の動作をさせるようにしたいと考え、下記のソース引用の通り実装しました。 ViewControllerの中にUIView(testView)を配置し、その中に、UIButton(testButton) を配置し、フリックが行われた際の開始位置と終了位置を取得しています。 ですが、下記実装ですと、フリックの開始位置が、testButton上である場合、 ViewController.m 上の、touchesBegan、touchesEnded を通りません。 カスタムのボタンを作って試してみたところ、ButtonのtouchesBegan、 touchesEndedには入ってきており、testButtonが非活性の場合には、 ViewController.m 上の、touchesBegan、touchesEnded を通って いるようですので、ボタン側のイベントが反応し、ViewController.m に入ってこず終了しているものと思っています。 これを、testView上のどの位置でフリック開始された場合でも同様の 処理をさせたいのですが、何か良い解決方法をご存知でしたら、 ぜひ、お知恵をお借りしたいです。 プログラム初心者のため、つたない質問で申し訳ありません。 よろしくお願いいたします。 ■ViewController.h の実装 ----------------------------------------- @interface ViewController : UIViewController { // フリック開始位置、終了位置 CGPoint _tBegan, _tEnded; } // ビュー @property (weak, nonatomic) IBOutlet UIView *testView; // @property (weak, nonatomic) IBOutlet UIButton *testButton; ■ViewController.m の実装 ----------------------------------------- // タッチ開始 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch * touchBegan = [touches anyObject]; _tBegan = [ touchBegan locationInView: self.testView ]; } // タッチ終了 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch * touchEnded = [touches anyObject]; _tEnded = [ touchEnded locationInView: self.testView ]; NSInteger distanceHorizontal = ABS( _tEnded.x - _tBegan.x ); NSInteger distanceVertical = ABS( _tEnded.y - _tBegan.y ); NSLog(@"%d", distanceHorizontal); NSLog(@"%d", distanceVertical); NSLog(@"X:%f->%f", _tBegan.x,_tEnded.x); NSLog(@"Y:%f->%f", _tBegan.y,_tEnded.y); if ( distanceHorizontal > distanceVertical ) { if ( _tEnded.x > _tBegan.x ) { NSLog(@"RIGHT Flick"); // スタート位置がmoveView内の場合、右フリックに応じた処理を記述予定 } else { NSLog(@"LEFT Flick"); // スタート位置がmoveView内の場合、左フリックに応じた処理を記述予定 } } else { if ( _tEnded.y > _tBegan.y ) { NSLog(@"DOWN Flick"); // 下向きフリックに応じた処理を記述予定 } else { NSLog(@"UP Flick"); // 上向きフリックに応じた処理を記述予定 } } }

  • Objective-C,viewが動作しない

    IBを使わないカメラアプリを作っています。 AppDelegate.m内のapplication didFinishLaunchingメソッド内で生成したwindowとviewはコンパイルして表示確認できたのですが、viewControllerで書いたUIImagePickerViewControllerのviewが出てきません。 そもそもviewController.mのloadViewメソッドやviewDidLoadメソッドが動いていません。(メソッド内にNSLogを書いてコンパイルしてもログに出ない) viewController.h #import <UIKit/UIKit.h> @interface CameraViewController : UIViewController <UINavigationControllerDelegate,UIImagePickerControllerDelegate> { @private UIImagePickerController* _imagePicker; } @property(nonatomic,retain) UIImagePickerController *imagePicker; @end viewController.m #import "CameraViewController.h" @implementation CameraViewController @synthesize imagePicker=_imagePicker; - (void)dealloc { [super dealloc]; } #pragma mark - View lifecycle - (void)loadView { [super loadView]; //UIImagePickerControllerの作成 if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){ return; } UIImagePickerController* imagePicker; imagePicker = [[UIImagePickerController alloc] init]; [imagePicker autorelease]; imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; imagePicker.allowsEditing=NO; imagePicker.delegate = self; //imagePickerのviewを最上部に [self presentModalViewController:imagePicker animated:YES]; //シャッターを切る [self.imagePicker takePicture]; } @end viewControllerが機能しない原因としてそういった可能性が考えられるのでしょうか? あれこれ調べてみましたが煮詰まっています。よろしくお願いします

  • Xcodeのラベル名とIBのラベル接続ができません

    Xcodeで、hogeViewController.h @interface hogeViewController : UIViewController { IBOutlet UILabel *myLabel; } @end を作成し、hogeViewController.xibをダブルクリックしてInterface Builderを開いて、 ViewにLabelを貼りつけ、 File's OwnerのOutletsからmyLabelをViewのLabelに接続したいのですが、 なぜかFile's OwnerのOutletsにmyLabelが表示されません。 昨日までは普通にできていたのですが、今日突然できなくなりました。 以前も同じようなことが起こり、その時は Xcodeの設定ファイル ~/Library/Preferences/com.apple.Xcode.plist を削除したら直ったのですが、 今回は設定ファイルを消しても直らないようです。 どうしたら良いのでしょうか?

  • View controllerのoutlet

    現在xcodeでswiftのプログラミングを行っています。 現在storyboardで複数のview controller(3つのview controllerを追加)を追加して、そのうちの1つの画面には現在時刻の表示するプログラムをしたいと思っています。 そこで、 リフレッシュのためにSwiftで時計を作った by @fantmsite on @Qiita http://qiita.com/fantm21/items/9b9abd472cfed0b5f883 こちらのサイトを参考にしてやってみようと思い、まず、 @IBOutlet weak var yearLabel: NSTextField! @IBOutlet weak var monthLabel: NSTextField! @IBOutlet weak var daysLabel: NSTextField! @IBOutlet weak var dayOfTheWeekLabel: NSTextField! @IBOutlet weak var hourLabel: NSTextField! @IBOutlet weak var minutesLabel: NSTextField! @IBOutlet weak var secondLabel: NSTextField! これらのOutletの登録を行う為、storyboardのView controllerに配置したlabelをcontrolボタンを押しながら、ViewController.swiftの画面の ”class ViewController: UIViewController {” 行の下側に引っ張ってみたのですが、outletを登録するのかとかの表示が全く出てきません。 いろいろといじってみてわかったことは 一番の最初のViewControllerのlabelやコマンドボタンなどはoutletの登録ができるのですが、2番目以降のViewControllerではこれができないことです。 どなたか解決方法をご教示いただきますよう、宜しくお願い致します。

    • ベストアンサー
    • Swift
  • SWIFT1.2アップデート後のエラー

    Xcode6(ver6.32)を使用しSwiftでアプリを作成しています。 Swift1.2になったのが原因だと思いますが AppleからのRejectを受け原因を調査したところ あるボタンをタップした際のイベント内にある下記でアプリが落ちるようです。 ちなみにシミュレーター上では落ちませんがデバイスにインストールすると発生します。 var mainViewController: UIViewController =storyboard.instantiateViewControllerWithIdentifier("ViewController") as! UIViewController 2週間ほど悩み続けておりますが解決できておりません。 どなたか原因をご教授ください。

  • Xcode4のエラー(IPhoneアプリ)

    はじめまして。 IPhoneのアプリ作成に挑戦しています。 Xcode4のバージョンは 4.5.1です。 【はじめてのXcode4プログラミング】という参考書でIPhoneのカメラアプリを作る章があり、写真ライブラリから選択した画像を表示できるとのことです。 しかし、XcodeでRun(実行)すると、ViewController.mの最後2行【UIImage *originalImage =[info objectForkey:UIImagePickerControllerOriginalImage];】が赤くなり、【’dismissModalViewControllerAnimated’is deprecated: first deprecated in iOS 6.0】というエラー表示がでます。 全体のコードは下記の通りです。 ネットで調べてみましたが、解決方法がわかりません。 先に進めず困っています。 どうか解決方法を教えてください。 よろしくお願い致します。 ●ViewController.h// // ViewController.h // CameraApp // #import @interface ViewController : UIViewController - (IBAction)pressCameraButton:(id)sender; @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end ●ViewController.m // // ViewController.m // CameraApp // #import “ViewController.h” @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)pressCameraButton:(id)sender { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentModalViewController:picker animated:YES]; } - (void)imagePickerController:(UIImagePickerController*)Picker didFinishPickingMediaWithInfo:(NSDictionary*)info { [self dismissModalViewControllerAnimated:YES]; UIImage *originalImage = [info objectForkey:UIImagePickerControllerOriginalImage]; self.imageView.image = originalImage; } @end

  • iPhoneアプリ作成時のXcodeのエラー

    はじめまして。 iPhoneのアプリ作成に挑戦しています。 Xcode4のバージョンは 4.5.1です。 【はじめてのXcode4プログラミング】という参考書でIPhoneのカメラアプリを作る章があり、写真ライブラリから選択した画像を表示できるとのことです。 しかし、XcodeでRun(実行)すると、ViewController.mの最後から4行目【UIImage *originalImage = [info objectForkey:UIImagePickerControllerOriginalImage];】が赤くなり、【No visible @interface for 'NSDictionary' declares the selector 'objectForkey'】というエラー表示がでます。 全体のコードは下記の通りです。 ネットで調べてみましたが、解決方法がわかりません。 先に進めず困っています。 どうか解決方法を教えてください。 よろしくお願い致します。 ●ViewController.h// // ViewController.h // CameraApp // #import @interface ViewController : UIViewController - (IBAction)pressCameraButton:(id)sender; @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end ●ViewController.m // // ViewController.m // CameraApp // #import “ViewController.h” @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)pressCameraButton:(id)sender { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [[self presentViewController:picker animated:YES completion:nil];} - (void)imagePickerController:(UIImagePickerController*)Picker didFinishPickingMediaWithInfo:(NSDictionary*)info { [self dismissViewControllerAnimated:YES completion:nil]; UIImage *originalImage = [info objectForkey:UIImagePickerControllerOriginalImage]; // ↑↑ 上記の行でエラーが出ます self.imageView.image = originalImage; } @end

専門家に質問してみよう