gpt4 book ai didi

c++ - Objective-C++中的智能指针可以完全取代ARC吗?

转载 作者:行者123 更新时间:2023-12-03 16:40:04 26 4
gpt4 key购买 nike

我是 Cocoa 框架的初学者,有一个问题:

假设我不在我的应用程序中使用“裸”NS 指针,那么 ARC 对我来说是多余的吗? :-)

换句话说,以下实现是否涵盖了 ARC 的所有问题? :-)

谢谢!

首先(“alloc..”、“new..”、“copy..”或“mutableCopy..”的结果累加):

#pragma once

// In-Ref(NOP), Out-Ref(--)
template<typename T>
class NSChargePtr
{
NSChargePtr(const NSChargePtr&) = delete;

protected:
T* m_object{};

public:
NSChargePtr(T* p = __nullptr)
: m_object(p)
{
}
virtual ~NSChargePtr()
{
[m_object release];
}
operator T*()
{
return m_object;
}
operator bool()
{
return __nullptr != m_object;
}
void operator=(T* p)
{
reset(p);
}
T* get()
{
return m_object;
}
virtual void reset(T* p = __nullptr)
{
[m_object release];
m_object = p;
}
};

...第二个(本地保存、转移):

#pragma once
#include "NSChargePtr.h"

// In-Ref(++), Out-Ref(--)
template<typename T>
class NSPassPtr : public NSChargePtr<T>
{
public:
NSPassPtr(T* p = __nullptr)
: NSChargePtr<T>(p)
{
[NSChargePtr<T>::m_object retain];
}
NSPassPtr(const NSPassPtr& other)
: NSChargePtr<T>(other.m_object)
{
}
virtual void reset(T* p = __nullptr) override
{
NSChargePtr<T>::reset(p);
[NSChargePtr<T>::m_object retain];
}
void operator=(T* p)
{
NSChargePtr<T>::operator=(p);
}
};

最佳答案

简而言之:可以做到这一点,但它可能不会像“真正的”ARC那样轻松,而且目前还不清楚这种方法是否比 ARC 提供任何改进弧。你为什么要这样做?

一些立即引起我注意的潜在问题:

  • NSPassPtrNSChargePtr 之间的区别已经是潜在混淆的主要根源。您需要确切地知道在哪种情况下使用哪一个,具体取决于方法是返回自动释放值还是保留值。您也无法将自动释放表达式的结果干净地重新分配给使用保留表达式的结果初始化的变量。
{
NSChargePtr<MyClass> obj = [[MyClass alloc] init];
// …
obj = [foo bar];
// …
} // over-release of result of [foo bar];
  • 线程安全。我在您的实现中没有看到任何防御竞争条件的证据。 ARC 在多线程上下文中具有明确定义的行为。
  • 性能和编译器优化。编译器了解 ARC,并且可以在证明不需要的情况下省略保留和释放调用。通过此实现,它无法做到这一点。 ARC 的 objc_retain/objc_release 可能也比发送 retain/release 消息更快。
  • 隐式转换运算符重载(operator T*()operator bool、非显式构造函数,例如 NSChargePtr(T * p = __nullptr)) 往往是错误的来源。

我应该指出,Objective-C++ 与 ARC 兼容,并且 ARC 引用在 C++ 对象构造/销毁的上下文中表现良好。因此,通常情况下,如果您真的很难让某些代码与 ARC 配合使用,最好将其移至禁用 ARC 的单独代码文件中,但在项目的其余部分保持启用 ARC。

最后:

NSPassPtr(const NSPassPtr& other)
: NSChargePtr<T>(other.m_object)
{
}

在我看来,它缺少一个retain

关于c++ - Objective-C++中的智能指针可以完全取代ARC吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61035555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com