忍者ブログ
  • 2024.10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/22 20:10 】 |
ObjCのカテゴリとクラス拡張
本当に今更なのだがまとめ。

参考

◯カテゴリ(category)
カテゴリは元々クラスを分割して書くことが出来るようにするため考えられた言語機能
インスタンス変数を追加できない
「分割実装」

実行時に解決される
だから、インスタンス変数を追加できない
ソースコードが存在しない、ライブラリのクラスを扱うことができる


「実装を」分ける。
macの公式実装とか見ると、カテゴリ複数は「AppController.h」に書いてあって
実装側だけ複数の.mファイルに分かれていたりする。

既存のライブラリの拡張も可能(「拡張」と言っているがカテゴリー)

1クラスに1つしか書けない@implementationを、複数に分けるためにカテゴリーを作っている、とも言える


カッコの中にカテゴリ名を書く。

@interface Document(Ex)



実装側にインスタンス変数の宣言はできない。以下はエラーになる

@implementation Document(Ex){
//こういうことはできない。カテゴリでない大元の実装ファイルに書く
}




◯クラス拡張(extension)
privateな変数、メソッドの宣言に使う
インスタンス変数を宣言できる
宣言したメソッドはクラス本体の(=カテゴリ無しの)@implementationで実装
公式で「無名カテゴリ」ともいうらしい

コンパイル時に解決される
だからインスタンス変数を追加できる


記述は、カッコのカッコの中は空

@interface Document()



元の宣言(.hの@interface)とは別に、.mファイルの方に書くのが普通。

実装側でインスタンス変数の宣言も可能

@implementation{
//変数宣言
//@propertyは不可
}




PR
【2015/11/17 12:38 】 | iPhone | 有り難いご意見(0)
<<swapBuffers エラーが出るときは | ホーム | GameCenterの実装>>
有り難いご意見
貴重なご意見の投稿














<<前ページ | ホーム | 次ページ>>