考虑以下代码示例:
class SomeArbitrarilyNamedClassPlusPlus {
public:
SomeArbitrarilyNamedClassPlusPlus(NSObject *object) { object_ = object; }
SomeArbitrarilyNamedClassPlusPlus() { object_ = nil; }
private:
NSObject *object_;
};
@interface SomeArbitrarilyNamedClassObjective : NSObject
{
SomeArbitrarilyNamedClassPlusPlus *_plusPlusObject;
}
@end
@implementation SomeArbitrarilyNamedClassObjective
-(id)init
{
if ((self = [super init]))
{
_plusPlusObject = new SomeArbitrarilyNamedClassPlusPlus(self);
}
return self;
}
-(void)dealloc
{
NSLog(@"deallocated");
delete _plusPlusObject;
}
@end
int main(int argc, const char * argv[])
{
{
SomeArbitrarilyNamedClassObjective *object = [[SomeArbitrarilyNamedClassObjective alloc] init];
}
return 0;
}
object
变量永远不会被释放。您可以使用Instruments进行检查 - -(id)init
调用中会发生额外的保留计数器增量。
我永远不会指望C ++类中的属性很强,这让我感到疑惑 - 有没有办法让指向Objective-C对象的c ++属性变弱?
更新
有一种方法可以避免使用C ++类中的void
而不是NSObject*
的指针,并在-(id)init
方法中初始化C ++类:
...
_plusPlusObject = new SomeArbitrarilyNamedClassPlusPlus((__bridge void*)self);
...
然而,问题仍然存在 - 有没有办法在C ++类中保存Objective-C类型但是使它们变弱?
答案 0 :(得分:2)
嗯,答案结果很简单 - 在C ++类中使用__weak
属性:
class SomeArbitrarilyNamedClassPlusPlus {
public:
SomeArbitrarilyNamedClassPlusPlus(NSObject* object) { object_ = object; }
SomeArbitrarilyNamedClassPlusPlus() { object_ = nil; }
private:
__weak NSObject* object_;
};