「Objective-C」の版間の差分

削除された内容 追加された内容
中括弧が対になっていない、字下げがずれているなどの問題が散見されたため中括弧の改行を変更した。
73行目:
<source lang="objc" style="margin-bottom: 1em;">
// クラスの定義 (MyObject.h)
@interface MyObject : NSObject
{
int val;
id obj;
86 ⟶ 87行目:
// 実装 (MyObject.m)
@implementation MyObject
+ (void)classMethod:(id)arg
{
// some operation
}
 
- (id)method:(NSObject*)arg1 with:(int)args2
{
return obj;
}
 
// 典型的なinit
- (id)init
{
self = [super init]; // スーパークラスの呼びだし
if(self != nil) {
{
val = 1;
obj = [[SomeClass alloc] init];
143 ⟶ 148行目:
// NSMethodSignatureはメソッドの引数の数や型情報を表すオブジェクト
// Objective-Cのメソッドはスカラー型をとるC関数互換なので正確なスタック情報が必要となる
- (NSMethodSignature*)methodSignatureForSelector:(SEL)sel
{
id signature = [otherObj methodSignatureForSelector: sel];
return signature;
151 ⟶ 157行目:
// 元のターゲットの代わりに別のターゲットで実行を行なうとあたかもそのオブジェクトにメッセージが送られたかのように動作する
 
- (void)forwardInvocation:(NSInvocation*)invocation
{
SEL aSel = [invocation selector];
if([otherObj respondsToSelector: aSel]) {
{
[invocation invokeWithTarget: otherObj];
}
else
{
[self doesNotRecognizeSelector: aSel];
}
188 ⟶ 198行目:
@end
 
- (void)method
{
id val,obj;
...
if([obj respondsToSelector: @selector(transferAcceptable:)]) {
{
[obj transferAcceptable: val];
...
}
}
</source>
214 ⟶ 227行目:
@implementation NSObject (BetterHash)
// 子孫クラスのうち、独自のオーバーライドのない-hashは全てこの実装に置き換わる
- (unsigned)hash
{
return better_hash_function(self);
}
253 ⟶ 267行目:
初期のObjective-CプログラムはC同様単純な割当と解放を行なっていたが、現在は標準APIライブラリに実装された[[参照カウント]]方式のAutorelease poolを利用するのが標準的である。参照カウント方式ではあるが[[ガベージコレクション]]とは異なり、半自動で行なわれる。方法としてはNSAutoreleasePoolクラスをインスタンス化し、ここに解放されるべきオブジェクトを、autoreleaseメッセージを用いて登録する。登録した全てのオブジェクトが不要になったらreleaseメッセージでNSAutoreleasePoolのインスタンスを解放する。すると登録されていたオブジェクトもすべて一斉に解放されるというものである
<ref>macやiOSの標準APIでは基底クラスNSObjectに参照カウントを実装してあり、他のクラスがNSObjectを継承している。
* [http://developer.apple.com/library/IOs/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html Apple IOs API Reference #NSObject](2012年1月20日閲覧)
* [http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html Apple mac API Reference #NSObject](2012年1月20日閲覧)
* [http://developer.apple.com/jp/devcenter/ios/library/documentation/MemoryMgmt.pdf 高度なメモリ管理プログラミングガイド]
* 荻原剛士『Mac OS X プログラミング入門 Objective-C』広文社,2001年,ISBN 4-87778-068-8</ref>。
ほかにもオブジェクト(仮にobjAとする)のイニシャライザ(初期化メソッド)を呼び出すと、その時点で自分をautoreleaseするオブジェクトを定義できる。そのようなオブジェクトをインスタンス化したユーザは、objAに対して明示的にautoreleaseせずとも、NSAutoreleasePoolのインスタンスをreleaseするだけでobjAを解放できることになる。例としてNSStringクラスがある。stringWithCString:で初期化するとautoreleaseされた状態になる。