

現在、カメラロールから選択した画像をMasterViewControllerのコレクションビューに表示できるようにしています。その一つを選択してShowViewControllerに遷移し、そこで前画面で選択された画像を大きく表示できるようにしています。(iPhoneオリジナルアプリの「写真」のような感じ)

ここが問題なのですが、ShowViewControllerからMasterViewControllerに戻った時にShowViewControllerの表示された画像が解放されず、メモリが蓄積されていってしまいます。

MasterViewController.m

[code]

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([[segue identifier] isEqualToString:@"showDetailView"])
        {
        NSIndexPath *indexPath = [self.collectionView.indexPathsForSelectedItems objectAtIndex:0];
        Record *record2 = _records2[indexPath.section];
        ShowViewController *showViewController = segue.destinationViewController;
        showViewController.image2 = record2.images2[indexPath.row];
        showViewController.delegate = self;
    }
    
[/code]

ShowViewController.h

[code]

    #import <UIKit/UIKit.h>
    #import "SubjectViewController.h"
    
    @protocol ShowViewControllerDelegate;
    
    @interface ShowViewController : UIViewController <UIScrollViewDelegate>
    {
        // UIImage *image2;
    }
    
    @property (weak, nonatomic) IBOutlet UIView *showSelectedPhoto;
    @property (weak, nonatomic) IBOutlet UIImageView *showSelected;
    @property (weak, nonatomic) IBOutlet UIScrollView *canScroll;
    
    @property (weak, nonatomic) UIImage *image2;
    
    @property (weak, nonatomic) id<ShowViewControllerDelegate> delegate;
    @end
    
    
    @protocol ShowViewControllerDelegate <NSObject>
    
    - (void)showViewControllerDeleteImage:(ShowViewController *)controller;
    
    @end
    
[/code]

ShowViewController.m

[code]

    #import "ShowViewController.h"
    #import "SubjectViewController.h"
    #import "LessonManager.h"
    
    @interface ShowViewController ()
    
    //拡大領域を求めるメソッド
    - (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center;
    
    @end
    
    @implementation ShowViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
        self.navigationController.navigationBar.barTintColor = [UIColor whiteColor];
        self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0/255.0 green:105/255.0 blue:62/255.0 alpha:1.0];
        self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor colorWithRed:0/255.0 green:105/255.0 blue:62/255.0 alpha:1.0]};
    
    
        _showSelected.image = _image2;
    
    
        _canScroll.delegate = self;
    
        _canScroll.minimumZoomScale = 1;
        _canScroll.maximumZoomScale = 3;
    
        _canScroll.scrollEnabled = YES;
        _canScroll.showsHorizontalScrollIndicator = YES;
        _canScroll.showsVerticalScrollIndicator = YES;
    
    
        //ダブルタップ時の処理
        UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
        doubleTap.numberOfTapsRequired = 2;
        self.view.userInteractionEnabled = YES;
        [self.canScroll addGestureRecognizer:doubleTap];
    
    }
    
    
    //ここで確保したメモリを解放したい
    - (void)viewDidDisappear:(BOOL)animated
    {
        if (_showSelected != nil) {
            _showSelected.image = nil;
            [_showSelected removeFromSuperview];
            _image2 = nil;
            _showSelected = nil;
        }
    
        [self.view removeFromSuperview];
    }
    
    - (IBAction)tappedTrash:(id)sender
    {
        NSLog(@"画像削除ボタンが押された");
        [self.delegate showViewControllerDeleteImage:self];
    }
    
    //イメージをピッチアウト・ピッチイン処理
    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    {
        return self.showSelected;
    }
    
    
    //ダブルタップ時の処理
    - (void)doubleTap:(UITapGestureRecognizer *)gesture
    {
        NSLog(@"画面ダブルタップ");
        //拡大時のブレ防止
        _canScroll.pagingEnabled = NO;
    
        //最大倍率じゃなければ拡大する
        if (_canScroll.zoomScale < _canScroll.maximumZoomScale) {
            //3倍の比率
            float newScale = _canScroll.zoomScale * 3;
            //拡大領域の指定
            CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gesture locationInView:gesture.view]];
            //タップした位置を拡大する
            [_canScroll zoomToRect:zoomRect animated:YES];
        } else {
            //倍率を1に戻す
            [_canScroll setZoomScale:1.0 animated:YES];
        }
    }
    
    
    //指定の座標を中心にして拡大領域を決める
    - (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center
    {
    
        CGRect zoomRect;
        //倍率から拡大する縦横サイズを求める
        zoomRect.size.height = [_canScroll frame].size.height / scale;
        zoomRect.size.width = [_canScroll frame].size.width / scale;
        //座標（左上）を設定する
        zoomRect.origin.x = center.x - (zoomRect.size.width / 2.0);
        zoomRect.origin.y = center.y - (zoomRect.size.height / 2.0);
        //領域を返す
        return zoomRect;
    }
    @end
    
[/code]

これで、ShowViewControllerからMasterViewControllerに戻った時には、ShowViewControllerで画像表示の際に生成したメモリが解放されると思ったのですが、メモリが減少していないので解放されていないように思われます。

どなたか何か分かる方がいましたら、ご教授お願いします。


CC BY-SA 3.0
2016-01-19T11:00:08.603
21072
2016-02-05T06:05:15.290
2016-02-05T06:05:15.290
8802
8802
question
objective-c iphone
UIImageの解放　メモリについて