我正在尝试从我的c.h文件与shared_ptr:s一起实现一个类。
为什么我的shared_ptr(totPtr)在方法之间不保留其值?
当我使用double而不是类时的示例代码:
#include <memory>
static std::shared_ptr<myCppClass> totPtr;
static double tot;
@implementation ViewController
- (void) createSelf
{
totPtr = std::make_shared<myCppClass>(5);
tot = 10;
}
在createSelf之后调用此方法:
- (void)otherMethod
{
tot += 1; // works, tot = 11
totPtr->doStuff(); // doesn't work, totPtr = nullptr
}
tot2仍然具有值= 0,但是tot具有值= 10
对于全局变量,您应该在中对其进行初始化+[initialize]
,这是一种初始化所有全局变量的线程安全方法
+ (void)initialize {
if (self == [ViewController self]) { // need to guard it so not get called again from subclass
totPtr = std::make_shared<MyClass>();
tot = 10;
}
}
如果您在中初始化它们viewDidLoad
,则现在可以使用,但是当您决定拥有的多个实例时ViewController
,您会发现第二次调用viewDidLoad
将重置这些gloabl变量。
但是通常您不需要全局变量,您需要实例变量/属性
@interface ViewController ()
@property (nonatomic) double tot;
@end
@implementation ViewController {
std::shared_ptr<myCppClass> _totPtr;
}
您可以viewDidLoad
在其他答案中对此进行详细说明。
注意:我不建议将ObjC属性与C ++类(即shared_ptr
)一起使用。因为每次通过属性访问它时,都需要调用setter / getter方法(可能需要复制)的开销shared_ptr
,这是一个扩展操作(您应始终shared_ptr
在方法参数中按引用传递,但这在ObjC中没有很好的支持)。直接访问ivar可以避免开销。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句