ASとか

開発系の記事が多めです。タイトルのASはActionScriptの略です。

メモリ管理でミスしないために

はじめに

これから書く手法は色々なところで言及されていますが、一度自分のブログにまとめておけば初心者の方とかに教える場合楽かなと思いました。ちなみにこれから説明する手法は

  • リファレンスカウンタを理解している

ことが前提となります。

まずサンプル

MemberListViewController.h
#import <UIKit/UIKit.h>

@class DataImporter;

// 与えられたリーダー名(leaderName)に紐づくメンバーのリストを表示する
@interface MemberListViewController : UIViewController {
@public
    NSString *leaderName;
@private
    IBOutlet UIButton *updateButton;
    DataImporter *importer;
    NSArray *memberList;
}

@property (nonatomic, copy) NSString *leaderName;

@end
MemberListViewController.m
#import "MemberListViewController.h"

#import "DataImporter.h"
#import "SubViewController.h"

@interface MemberListViewController ()

@property (nonatomic, retain) UIButton *updateButton;
@property (nonatomic, retain) DataImporter *importer;
@property (nonatomic, retain) NSArray *memberList;

// メンバーリストを取得し直し、画面を更新する
- (IBAction)updateMemberList;

// メンバーリストを元に画面更新
- (void)updateView;

@end

@implementation MemberListViewController

@synthesize leaderName;

@synthesize updateButton;
@synthesize importer;
@synthesize memberList;

- (void)dealloc
{
    [self viewDidUnload];
    self.leaderName = nil;
    
    [super dealloc];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // メンバーリスト取得用モジュール
    self.importer = [[[DataImporter alloc] init] autorelease];
    
    // 画面作成
    self.memberList = [importer getMemberList:leaderName];
    [self updateView];
}

- (void)viewDidUnload
{
    self.updateButton = nil;
    self.importer = nil;
    self.memberList = nil;
    
    [super viewDidUnload];
}

#pragma mark - IBAction

- (IBAction)updateMemberList
{
    self.memberList = [importer getMemberList:leaderName];
    [self updateView];
}

#pragma mark - View Update

- (void)updateView
{
    
}

@end
DataImporter.h
#import <Foundation/Foundation.h>

// 色んなデータを取得(適当)
@interface DataImporter : NSObject {
    
}

// リーダー名からメンバー名のリストを取得
- (NSArray *)getMemberList:(NSString *)leaderName;

@end
DataImporter.m
#import "DataImporter.h"


@implementation DataImporter

- (NSArray *)getMemberList:(NSString *)leaderName
{
    NSMutableArray *result = [NSMutableArray array];
    // メンバーの名前を詰め込む
    return result;
}

@end

サンプルの説明

MemberListViewControllerは、外から与えられたleaderNameを元に、それに紐づくメンバーの情報を一覧表示します。また、更新ボタンがあり、それをタップすると最新のメンバー情報を取得し直し、画面を更新します。メンバー情報は、DataImporterのgetMemberList:から取得します。

各メモリ管理手法は別エントリで

サンプルを載せたら長くなってしまったので、説明は別エントリで行っていきます。あと突っ込みは大歓迎なので、ぜひよろしくお願いします。