我们都知道 Objective-C++ 的文档是多么稀疏。我在这方面找不到任何东西,但我也发现很难找到合适的明确搜索词。 所以,Stackoverflow 来拯救(我希望)!
我有一个 C++ 类,我在 Objective-C(++) 类中有一个实例(并且我为要调用的构造函数/析构函数启用了项目设置)。
这一切工作正常,直到我尝试通过 @synthesize
d 属性公开实例。我将其设为 assign
属性(因为 Obj-C 保留计数不适用)。该属性似乎有效,除非我设置实例时我希望涉及复制构造函数。
我实际看到的是创建了一个临时实例(调用了 that 上的复制构造函数)——这都是预料之中的。但 不 调用了 ivar 实例上的复制构造函数。这些值是“神奇地”设置的。我假设 @synthesize
d 代码正在执行类似于 memcpy
的操作作为最后一步。这对 C struct
s 很好,但对 C++ class
es 没有太大帮助,因为代码的正确性取决于正确调用的复制构造函数和赋值运算符。
有没有人更深入地研究过这个,让它工作,或者确认不可能在 Obj-C(++) 类中将 C++ 对象作为 ivars 保存,并让 @ 调用复制构造函数合成
d 属性 setter ?
(如有必要,我可以发布所有这些的示例代码 - 但即使是最小版本也是一屏左右)。
最佳答案
嗯,如果我没有混淆的话,没有调用复制构造函数是完全合理的。你希望那个ivar被神奇地破坏和复制构造吗?我想这违反了 C++ 的规则。如果合成setter是概念上的
-(void)setFoo:(Foo)foo_{
foo=foo_;
}
那么应该调用 operator=
,而不是复制构造函数。
也就是说,operator=
也没有被调用,真可惜(10.6.4,gcc 4.2.1。)!这是示例代码:
#import <Foundation/Foundation.h>
class Foo{
int a,b;
public:
Foo():a(0),b(0){NSLog(@"default constructor for %p",this);}
Foo(const Foo&foo):a(foo.a),b(foo.b){NSLog(@"copy constructor for %p",this);}
Foo& operator=(const Foo& foo){
NSLog(@"assignment operator for %p",this);
a=foo.a;
b=foo.b;
return *this;
}
};
@interface Bar:NSObject {
Foo foo;
}
@property (assign) Foo foo;
@end
@implementation Bar
@synthesize foo;
@end
int main(){
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
Bar* bar=[[Bar alloc] init];
Foo foo;
bar.foo=foo;
[pool drain];
}
将它保存到 boo.mm
中,我有:
$ g++ -fobjc-call-cxx-cdtors boo.mm -framework Foundation
$ ./a.out
2010-09-04 12:32:06.570 a.out[24352:903] default constructor for 0x10010cdc8
2010-09-04 12:32:06.572 a.out[24352:903] default constructor for 0x7fff5fbff7e0
2010-09-04 12:32:06.573 a.out[24352:903] copy constructor for 0x7fff5fbff7d0
$
现在,我有了上面写的显式 setter 而不是 @synthesize Foo
,我正确地有了
$ ./a.out
2010-09-04 12:42:22.206 a.out[24417:903] default constructor for 0x10010cdc8
2010-09-04 12:42:22.209 a.out[24417:903] default constructor for 0x7fff5fbff7e0
2010-09-04 12:42:22.210 a.out[24417:903] copy constructor for 0x7fff5fbff7d0
2010-09-04 12:42:22.210 a.out[24417:903] assignment operator for 0x10010cdc8
生成合成setter的clang源代码是this ,参见 GenerateObjCSetter
。在那里,它最终测试是否需要 C++ 赋值运算符。我会说这是一个灰色地带,没有很好的记录,但目前正在实现......
关于c++ - Objective C++ 代码中的合成属性 setter 未调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3642979/