【问题标题】:Objective-C++ and objects retainingObjective-C++ 和对象保留
【发布时间】:2014-10-01 22:00:17
【问题描述】:

考虑这个代码示例:

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);
    ...

但是,问题仍然存在 - 有没有办法将 Objective-C 类型保存在 C++ 类中但使其变弱?

【问题讨论】:

  • 那是不是 C++...

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


【解决方案1】:

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

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

private:
    __weak NSObject* object_;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多