Objective-C ++和对象保留

时间:2014-10-01 22:00:17

标签: objective-c objective-c++ retaincount strong-references

考虑以下代码示例:

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类型但是使它们变弱?

1 个答案:

答案 0 :(得分:2)

嗯,答案结果很简单 - 在C ++类中使用__weak属性:

class SomeArbitrarilyNamedClassPlusPlus {
public:
    SomeArbitrarilyNamedClassPlusPlus(NSObject* object) { object_ = object; }
    SomeArbitrarilyNamedClassPlusPlus() { object_ = nil; }

private:
    __weak NSObject* object_;
};