2014-10-01 49 views
-1

考虑以下代码例如:目标C++和物体保持

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可变永远不会被释放。您可以使用仪器进行检查 - 在-(id)init呼叫中会发生额外的保留计数器增量。

我永远不会期望C++类中的属性很强,这让我想知道 - 有没有办法让C++属性指向Objective-C对象很弱?

UPDATE: 还有就是要避免这种使用指针来void在C++类的代替NSObject*和初始化的C++类在-(id)init方法那样的方法:

... 
    _plusPlusObject = new SomeArbitrarilyNamedClassPlusPlus((__bridge void*)self); 
    ... 

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

+0

之所以如此,是** **不是C++ ... – Deduplicator 2014-10-01 22:03:44

回答

0

那么,答案竟然是非常简单 - 使用__weak属性在C++类:

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

private: 
    __weak NSObject* object_; 
};