u16suzuの blog

日々学んだことのメモブログです。

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でも、日本語をオブジェクト名には使えない

参考にしたページ http://d.hatena.ne.jp/kamiyan2/20110220