Objective-C調べたことメモ メモリ管理編
雑然としたメモです。
以下の場合、エラーではなくコールされないだけ。
LLのようにObjectiv-Cでは、動的にメソッドがあるかをチェックしている。
hを宣言しない場合はエラーになる。
Hoge *h = nil; [h method];
また、NSStringなどの開放してはいけないオブジェクトは retainCountで uint maxである2147483647 を返す。これに2日悩みました。
releaseでretainCountを0にしても反映されない
以下のソース参照。dealloc()は呼ばれているので
開放はしているみたい。
@interface Hoge : NSObject @end @implementation Hoge -(void) hi{ NSLog(@"hi"); } -(void) dealloc{ NSLog(@"dealloc is called"); [super dealloc]; } @end #import <UIKit/UIKit.h> int main(int argc, char *argv[]) { Hoge *h = [[Hoge alloc] init]; NSLog(@"%d", [h retainCount]); [h retain]; NSLog(@"%d", [h retainCount]); [h hi]; [h release]; [h release]; //0と表示されるはずが、1と表示される。 NSLog(@"%d", [h retainCount]); //class nil に対してimplementation hi //というメソッドはないというerror が発生する。 [h hi]; return 0; }
ちなみに、nil代入した場合、メソッドがコールされないだけで
エラーは発生しない。
h = nil; [h hi];
メンバオブジェクトにはプロパティを使いましょう。
@interface Hoge : NSObject { NSData *d; } @property(nonatomic, retain) NSData *d; @end @implementation Hoge @synthesize d;
コンビニエンスイニシャライザで確保したオブジェクトにretin,releaseした場合
発生するエラー
NSData *d2 = [NSData dataWithBytes:"hoge" length:4]; [d2 release];
*** __NSAutoreleaseNoPool(): Object 0x4b0eb00 of class NSConcreteData autoreleased with no pool in place - just leaking
ソースがUTF-8でも、日本語をオブジェクト名には使えない