Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Objective-C++ - インスタンス変数のコンストラクタ/デストラクタ

タグ: Objective-C C++

http://d.hatena.ne.jp/faith_and_brave/20081121/1227260455

Xcode(GCC)には、「Call C++ Default Ctors/Dtors in Objective-C」というオプションがあります。

これを ON にすると、 Objective-C のクラスメンバに C++ クラスオブジェクトを持ったときにC++ クラスオブジェクトのコンストラクタとデストラクタが呼ばれるようになります。

(;゚Д゚)マジで!
それはリンゴとハチミツが恋をした並の衝撃。
ということはこのクラス

@interface Foo : NSObject
{
	NSString* string;
	boost::shared_ptr<Bar> bar;
	Baz* baz;
};
- (id)initWithString:(NSString*)str bar:(const boost::shared_ptr<Bar>&)br baz:(Baz*)bz;
@end

@implementation Foo
- (id)initWithString:(NSString*)str bar:(const boost::shared_ptr<Bar>&)br baz:(Baz*)bz
{
	if(self = [super init])
	{
		string = [str retain];
		bar = br;
		baz = bz;
	}
	return self;
}

- (void)dealloc
{
	[string release];
	[super dealloc];
}
@end

こう書けるわけか。
shared_ptrをnewするのは気持ち悪かったからこれは良い。
ついでに

@property (nonatomic) boost::shared_ptr<Bar> bar;

できるようにならんかなーと試してみたが、やっぱダメだった。

スポンサーサイト

コメント

[C14]

すんません、もしかしたら自分ものすごい勘違いをしているのかもしれないのですが、
オプション使わない場合は、普通に配置newと配置delete使った下記のコードじゃダメすか?

#import <Foundation/Foundation.h>
#include <string>
#include <iostream>

@interface Foo : NSObject 
{
  std::string member;
};
- (id)init;
- (void)dealloc;
@end 
 
@implementation Foo
- (id)init
{
  new(&member) std::string("test");
  return self;
}

- (void)dealloc 
{ 
  using namespace std;
  cout << member << endl;
  member.~string(); //
  [super dealloc]; 
} 
@end

int main() {
  Foo* foo = [[Foo alloc] init];
  [foo dealloc];
  return 0;
}
  • 2009-03-11 00:06
  • URL
  • 編集

[C15]

一応動くっぽいけどgccがwarning出しまくってうざい(;´д`)
おとなしくオプション使うことにしますm(__)m
  • 2009-03-11 00:12
  • URL
  • 編集

[C16]

配置newの使用に関しては適切かと。
ただ、おっしゃるとおり警告は消えないので、このままだと
・オプションを使わなければ「警告は出る」が「正しい」
・オプションを使うと「警告は出ない」が「コンストラクタとデストラクタが2回呼ばれる」
という嫌なコードに(;´Д`)

>おとなしくオプション使うことにしますm(__)m
それが無難だと思います。
  • 2009-03-11 02:32
  • むい
  • URL
  • 編集

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/182-f721a25a
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。