24
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

オブジェクトのメモリ管理で気をつけること2つだけ

Posted at

Objective-C初心者向けです。

Objective-Cはポインタを直に扱う言語なので、メモリ管理を意識しないと簡単に落ちてしまいます。
なのでJavaやJavaScript等のメモリ管理をよきに計らってくれる言語しか使ったことがないと非常に苦労すると思います。

しかし以下に挙げる2点さえしっかり守ってくれれば、かなり落ちにくくなると思います。

1. allocを書いたら、即releaseを書くべし

alloc initを書いたら次の行でまずreleaseしましょう。
ファイルを変更したらCtrl+Sを押すのと同じくらい、無意識にやるように習慣化するのが良いです。
これによってメモリの開放漏れによるバグが激減するはずです。

まずalloc/releaseペアを書いて

NSMutableArray *array = [[NSMutableArray alloc] init];
[array release];

その後オブジェクトを使った処理を追加しましょう

NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:something];
...
[array release];

2. ポインタをオブジェクト内で保持する場合は必ずプロパティ経由にすべし

私はポインタをオブジェクト内で保持する場合(つまりクラスのメンバ変数にポインタがある場合)は、
必ず対応するプロパティを作成するようにしています。
経験上これは非常に有効です。

どういうことかって言うと、
以下のように名前(NSStringのポインタ)を持つUserというクラスを定義するとします。

@interface User {
	NSString *_name;
}
@end

その場合、必ず、_nameに対応するプロパティを追加します。

@interface User {
	NSString *_name;
}
@property(nonatomic, retain) NSString *name;
@end

そしてこの名前フィールドにアクセスする場合は、メンバ変数を直に触るのではなく、
必ずプロパティ経由でアクセスするようにします。

メンバ変数直アクセスはNG

// 代入
_name = name;
[_name retain];
// 開放
[_name release];

プロパティ経由でアクセスしよう

// 代入
self.name = name;
// 開放
self.name = nil;

要はretain/releaseとかいちいちやってると、いつかミスるよってことです。
プロパティ経由の開放にしておけばreleaseの多重呼び出しで落ちることを防げます。
また、コード中にretainやreleaseが散財していると、どうも精神衛生上よろしくないように思います。
その状態を何とも思わないというのも危険です。

補足

なお、今回はautorelease pool/ARC/blocksについては置いておきます。
autorelease pool/ARC/blocksはとても便利ですが、よくわかってないで使うと罠にはまる可能性が高まります。
また所詮後付けされた機能ですので、使わなくてもなんとかなるはずのものです。
Objective-Cについてよくわかっていないうちは、これらの機能は使わない方がいいんじゃないかと思います。

24
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?