2012-05-27 42 views
-1

注意到如何妥善执行weak_ptr的实现是在当前的Objective-C(见herehere),我敢肯定,必须有在那里提供类似于C++ shared_ptrweak_ptr语义的东西库引用计数没有所有这些荒谬的额外电话retainrelease应该被自动调用时(指针)变量超出范围shared_ptr的/客观-C

这是可能的ObjC?我知道ObjC没有析构函数,所以当变量超出范围时,没有办法自动调用某些东西,但这些调用怎么会真的有必要?我是否以错误的方式解决这个问题?

回答

2

这由ARC负责。除ARC之外,没有其他方法可行。在C++中,你有堆栈对象,你可以重载赋值(=)和尊重( - >)。两者都是共享指针所必需的。 Niether可以在客观C中完成。

9

注意到多么严重的实施是当前Objective-C的引用计数...

我再跟这一点。这是不是严重落实。只是你对不熟悉。 I认为它非常简单,因为只有几条规则需要知道。所以不要因为对你不熟悉就把它敲掉。

这是可能的ObjC?

是的,这是可能的。它被称为ARC(“自动引用计数”)。有关更多信息,请参阅“Transitioning to ARC Release Notes”。

我知道ObjC没有析构函数

事实上,它的作用。这就是-dealloc方法。

...当变量超出范围

事情都懂的Objective-C是对象不出去的范围,因为对象只能在堆中分配(<这里插入正常的警告关于非复制块>)。指向这些对象(即变量)的指针可以进入和退出范围,但对象本身始终处于范围内,因为从技术上讲,堆在范围上被视为全局范围。 (只是如果你丢失了物体的地址,几乎不可能再找到它)

+0

感谢您的回答。关于变量因堆被分配而不能超出范围的问题。是但是,指针本身就像堆栈中一样。当这些堆栈指针超出范围时,应该调用引用跟踪cleaup(由'release'完成)。对不起,我认识到我对objC内存管理模型并不熟悉,但我认为我的批评应该由具有引用计数实现经验的任何人共享,这些语言可以使用RAII语言。 – lurscher

+1

@lurscher是的,指针在堆栈中。但是在C语言中(Objective-C被构建),指针只是一个恰好被解释为内存地址的数字。从我对RAII粗糙的理解中,似乎只是因为语言是围绕基于异常的控制流而建立的,对吗? (以保证析构函数运行)如果是这样的话,那么它是没有实际意义的,因为Objective-C *真的*不鼓励基于异常的控制流。但正如我所说,ARC是编译器试图为你做你想做的。它工作得很好。 –

+0

我明白,指针只是值,但编译器具有在指针变量超出范围时添加释放消息所需的知识,它只是选择将该负担留给程序员。最糟糕的部分是,它似乎是一个负担,无法正确隐藏作为库指针对象的实现细节。此外,RAII的范围比仅仅在发生异常时释放资源的机制更广泛,但这不属于当前要讨论的问题的范围 – lurscher