Skip to content

Instantly share code, notes, and snippets.

@monmon
Created October 6, 2011 13:45
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save monmon/1267428 to your computer and use it in GitHub Desktop.
Save monmon/1267428 to your computer and use it in GitHub Desktop.
privateなpropertyを作りたい時は無名カテゴリ(クラスエクステンション)を使う
/**
* Foo.h
*/
@interface Foo
// プロパティを使うのでインスタンス変数は省略する
// ここでは外部から触られても書き込みできないようにreadonlyにする
@property (readonly, retain) NSString *str;
@end
/**
* Foo.m
*/
// 無名カテゴリを使ったプライベートな宣言部分
@interface Foo ()
// ここでは内部から書き込みができるようにreadwriteにする
@property (readwrite, retain) NSString *str;
@end
// 実装部分
@implementation Foo
@synthesize str = _str;
@end
@monmon
Copy link
Author

monmon commented Oct 6, 2011

@interface Foo (Private)
ってやる例もあるもあるのだけど、
例えばprivateなproperty以外に
- (void)_method;
みたいなprivate methodを作ること想定した場合、
無名カテゴリなら実装しない場合にコンパイルエラーを出してくれるのでやはり無名カテゴリの方がメリットありそう。

そう考えると(Private)ってカテゴリ作るメリットは何だろう?

@monmon
Copy link
Author

monmon commented Oct 7, 2011

答え

無名カテゴリを使わないとpropertyは拡張できない。
(Private)でpropertyをreadwriteを書いてもwrite権限は貰えない。

なので、propertyを拡張する(privateなpropertyを作る)時は()を使う。
privateなmethodを作る時は(Private)にする。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment