iOS 開発で、EXC_BAD_ACCESS とさよならするための6つのルール | Zero4Racer PRO Developer’s Blogの記事を読んでいただき、ありがとうございます。”アキラ”さんから、
オブジェクトは必ずプロパティにする、というのは、利便性を考えれば理解はできますが、
それはクラス設計者が楽をするためであって、カプセル化を無意味にする行為なので、それほどいい選択とは言えないと思いますねぇ。
という指摘を頂きました。これは、プログラムを正しくカプセル化する上で重要です。私もこれは非常に重視していますが、Objective-Cには、プロパティに、プライベート、パブリックの指定が出来ないので、一見、プライベートのプロパティが指摘出来ないように感じます。しかしちょっとの工夫で、実現することが出来ます。
コードで書くと、以下のようになります。
[sourcecode language=”objc”]
//
// MyClass.h
// testCategory
//
// Created by Tomohisa Takaoka on 3/17/11.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MyClass : NSObject {
NSString *name;
NSString *passcode;
}
@property (nonatomic, retain) NSString *name;
@end
[/sourcecode]
[sourcecode language=”objc”]
//
// MyClass.m
// testCategory
//
// Created by Tomohisa Takaoka on 3/17/11.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "MyClass.h"
@interface MyClass ()
@property (nonatomic, retain) NSString *passcode;
@end
@implementation MyClass
@synthesize name;
@synthesize passcode;
-(void) foo {
self.name = @"name";
self.passcode = @"passcode";
}
@end
[/sourcecode]
このように、プライベート用途で使用したい場合は、モジュールファイル内に、無名カテゴリを作成して、その中に、プライベート用途で使用したいプロパティを作成しています。それによって,他のクラスからそのプロパティを参照しようとすると、コンパイルエラーが発生するようになります。
このように、可能な限りプロパティを使用することによって、記述ミスによる、エラーを防ぎ、正しくカプセルか化を行った上で、コードを記述するようにしています。更なる改善についてのアイディアがあれば、是非教えてください。