頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


クラス外から参照させない"プロパティ"の書き方

クラス外から参照されたくないクラス内専用のプロパティを記述する方法についてのお話だよ。
この前人様のコードを見てて気が付いたんだけど、こういう書き方があったんだ!と目からウロコが落ちまくったので書いておくよ。もちろんObjective-Cね。

そもそもなんでクラス外から見られたくないんだ、クラス外から参照できるようにするためのものがプロパティじゃないのかって感じなんだけど、クラス内専用にしたい時っていうのがあるんだ。

どんな状況かというと、クラス内であるオブジェクトを持つ時に、それが何回作っちゃうかわからないようなモノだとメモリリークがイヤだから通常のインスタンス変数じゃなくてプロパティの形にすることがあるんだ。
もちろんARC(Automatic Reference Counting)は無しの場合ね。
例えばインスタンス変数だとあるクラス(MyViewControllerクラス)内の実装ファイル(MyViewController.m)でこんな書き方をしたとするよ。
//MyViewController.m
#import "MyViewController.h"
@interface MyViewController () {
	Hoge *hoge;
}
@end

@implementation MyViewController

-(void)loadView
{
    [super loadView];

    [self makeObject];
}

-(void)makeObject
{
    hoge = [[Hoge alloc] init];
}
@end
makeObjectというメソッド内でHogeクラスのオブジェクトを作ってるんだけど、実はこのメソッドがどこから何回呼ばれるかよくわからない、とするとこのhogeオブジェクトをどうやってリリースするんだって悩むでしょ?
だから今まで俺はこういう時にプロパティにしてたんだよ。
コードはこんな感じ。
//MyViewController.h
@interface MyViewController : UIViewController

@property(nonatomic,retain) Hoge *hoge;

@end

//MyViewController.m
#import "MyViewController.h"
@interface MyViewController () {
}
@end

@implementation MyViewController

-(void)loadView
{
    [super loadView];

    [self makeObject];
}

-(void)makeObject
{
    self.hoge = [[[Hoge alloc] init] autorelease];
}
@end
こうしておけば最後にnilを入れればリークの心配はないよね(上には書いてないけど)。Xcodeのいつからだったか@synthesizeも書かなくてもよくなったから楽チンだ。それでいて_hogeでアクセスもできるし。
ただこの方法だと本当にクラス外からアクセスできるプロパティと区別がつかないんだよね。
だから何だ?と言われればそれまでなんだけど、俺としてはそれが気持ち悪いんだよ。
後々このクラスのヘッダーをみたらどのクラスかがhogeプロパティを参照してるのか?書き換えてるのか?とか思っちゃうじゃない。
インスタンス変数なら@publicとかでああ、クラス外からも参照するんだなってわかるけど、プロパティにはそういうのはないよね。
なんとかならないのかなあってことでマイルールなんだけど俺はずっとそういうクラス外から参照されない、クラス内専用の"プロパティ"には文字列の後ろにアンダーバーを付けているんだよ。
ここだとプロパティの設定のところで
@property(nonatomic,retain) Hoge *hoge_;
こんな感じに。あまり見た目よくないけどねえ。

ところが、だよ。

こういう書き方してるのをたまたま見たんだ。
//MyViewController.m
#import "MyViewController.h"
@interface MyViewController () {
}
@property(nonatomic,retain) Hoge *hoge;
@end

@implementation MyViewController
//実装部分
@end
なんのことはない、ヘッダー部分じゃなくて実装ファイル側でプロパティを設定してるんだ。
これだとヘッダーに何にもプロパティhogeのことは書いてないので、当然クラス外から参照できない。
クラス内からはちゃんとアクセスできて後から見てもああ、これはクラス外からアクセスしない"プロパティ"だな、というのがすぐわかる。
これだよ、これ!これならコードの記述がすっきりするわ。
ふー、もっと早く知りたかったよ。

<< 祝!イオン貝塚店がオープン!   TopPage  釣った魚を料理してみたら >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/688-5cc09d47




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad