我很好奇__del__python中的细节,何时以及为什么应该使用它以及它不应该用于什么.我已经学到了很难的方法,它不像人们对析构函数的天真期望,因为它不是__new__/ 的反面__init__.
class Foo(object):
def __init__(self):
self.bar = None
def open(self):
if self.bar != 'open':
print 'opening the bar'
self.bar = 'open'
def close(self):
if self.bar != 'closed':
print 'closing the bar'
self.bar = 'close'
def __del__(self):
self.close()
if __name__ == '__main__':
foo = Foo()
foo.open()
del foo
import gc
gc.collect()
Run Code Online (Sandbox Code Playgroud)
我在文档中看到,不保证__del__()在解释器退出时仍然存在的对象调用方法.
Foo解释器退出时存在的任何实例都关闭了吧?del foo还是gc.collect()......或者两者都没有?如果你想更好地控制那些细节(例如,当对象未被引用时应该关闭条形图)实现它的常用方法是什么?__del__被调用时能够保证所有的__init__已经叫什么名字?如果__init__举起怎么样?python constructor garbage-collection destructor reference-counting
我来自C++背景,我和C#一起工作了大约一年.像许多其他人一样,我对于为什么确定性资源管理不是内置于语言中而感到困惑.我们没有确定性的析构函数,而是具有处置模式.人们开始怀疑是否通过他们的代码传播IDisposable癌症是值得的.
在我的C++偏见的大脑中,似乎使用带有确定性析构函数的引用计数智能指针是垃圾收集器的一个重要步骤,它需要您实现IDisposable并调用dispose来清理非内存资源.不可否认,我不是很聪明......所以我纯粹是想要更好地理解为什么事情就是这样.
如果修改了C#,那么:
对象是引用计数.当对象的引用计数变为零时,将在对象上确定性地调用资源清理方法,然后将该对象标记为垃圾回收.垃圾收集在将来某个非确定性时间发生,此时回收内存.在这种情况下,您不必实现IDisposable或记得调用Dispose.如果要释放非内存资源,则只需实现资源清理功能.
编辑:从目前为止的评论,这是一个坏主意,因为
我认为第一名是有效的,但使用弱引用很容易处理第二名.
那么速度优化是否超过你的缺点:
如果您的资源清理机制是确定性的并且内置于该语言中,则可以消除这些可能性.
一个简单的问题.
如果我有一个属性和一个声明同名的ivar:
在.h文件中:
(Reminder*)reminder;
@property(nonatomic,strong)(Reminder*)reminder;
Run Code Online (Sandbox Code Playgroud)
在.m文件中,如果我使用ARC,我应该在init方法中使用ivar还是属性?
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
reminder = reminder_;
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
或者我应该使用该属性来获得自动引用计数的好处,如下所示:
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
self.reminder = reminder_;
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我不确定在对象的初始化中哪个点可以使用点表示法访问属性.
initialization reference-counting objective-c ios5 automatic-ref-counting
在纯函数式语言中,数据是不可变的.通过引用计数,创建引用周期需要更改已创建的数据.似乎纯函数式语言可以使用引用计数而不必担心循环的可能性.我是对的?如果是这样,他们为什么不呢?
我知道在许多情况下引用计数比GC慢,但至少它减少了暂停时间.如果暂停时间不好,可以选择使用引用计数.
garbage-collection functional-programming memory-management reference-counting purely-functional
在iOS项目中使用新的自动引用计数(ARC)内存管理方式有哪些优缺点?
使用iOS 5.0 SDK进行开发时,您可以选择不使用ARC吗?
您是否为新项目推荐ARC或手动引用计数(MRC)?
使用ARC的应用程序是否能够在比iOS 5.0更旧的操作系统版本上运行?
或者,为什么retainCount我的暑假没有使用
这篇文章的目的是征求关于臭名昭着的方法的原因和原因的详细报道retainCount,以巩固围绕SO的相关信息.*
基础知识:不使用的官方理由是什么retainCount?是否有过任何情况下都当它可能是有用的?应该做些什么?**随意编辑.
历史/解释:如果不打算使用Apple,为什么Apple在NSObject协议中提供此方法?Apple的代码是否依赖于retainCount某些目的?如果是这样,为什么不把它隐藏在某个地方?
为了更深入地理解:对象可能具有与用户代码假设不同的保留计数的原因是什么?您能否举例说明框架代码可能会使用哪些标准程序导致这种差异?是否有任何已知的情况,保留计数总是与新用户可能期望的不同?
你认为还有什么值得关注的retainCount吗?
*不熟悉Objective-C和Cocoa的编码人员经常努力解决或至少误解参考计数方案.教程解释可能提及保留计数,这(根据这些解释)当你打电话上去一个retain,alloc,copy由一个当你调用等,向下release(并在当你调用未来的某一时刻autorelease).
因此,一个崭露头角的可可黑客克里斯可以很容易地认识到,检查一个对象的保留计数对于解决一些内存问题是有用的,而且,有一种方法可用于每个被调用的对象retainCount!克里斯打电话retainCount给几个对象,这个对象太高了,而且这个对象太低了,到底发生了什么?!因此,Kris在SO上发帖,"我的记忆管理出了什么问题?" 然后一群<bold>,<large>字母下降说"不要那样做!你不能依靠结果.",这是好的,但我们的强悍编码器可能需要更深入的解释.
我希望这会变成一个常见问题解答,一个很好的信息论文/讲座的页面,我们的任何专家都倾向于写一个,当他们想知道时可以指出新的可可头retainCount.
**我不想让它过于宽泛,但是经验或有关验证/调试保留和释放配对的文档的具体提示可能适合此处.
***在虚拟代码中; 很明显,一般公众无法访问Apple的实际代码.
我有点顽固,但我想了解弱弱和强烈的参考,所以这就是为什么我再次问你.
考虑一下:
__weak NSString* mySecondPointer = myText;
NSLog(@"myText: %@", myText);
Run Code Online (Sandbox Code Playgroud)
结果是myText: (null)非常明显的 - 弱引用在赋值后设置为null,因为没有对尖头对象的强引用.
但在这种情况下:
__strong NSString* strongPtr = [[NSString alloc] initWithFormat:@"mYTeSTteXt %d"];
// weak pointer points to the same object as strongPtr
__weak NSString* weakPtr = strongPtr;
if(strongPtr == weakPtr)
NSLog(@"They are pointing to the same obj");
NSLog(@"StrongPtr: %@", strongPtr);
NSLog(@"weakPtr: %@", weakPtr);
NSLog(@"Setting myText to different obj or nil");
// after line below, there is no strong referecene to the created object:
strongPtr = [[NSString alloc] …Run Code Online (Sandbox Code Playgroud) weak-references reference-counting objective-c strong-references
我理解并欣赏.NET框架中System.WeakReference类的用处,但我对实现细节很好奇.
WeakReference是如何在.NET中实现的?MSDN详细讨论了WeakReference的用法,但是我已经看到了一些关于它如何工作的细节.
CLR如何跟踪引用并知道在收集目标时将内部句柄清空,而不会阻止GC?它是否需要CLR本身的特殊处理?
我主要担心的是,使用WeakReferences(特别是如果使用其中许多)与使用标准对象引用时的性能有关.
为什么在C中返回Py_None之前需要Py_INCREF(Py_None),如下所示?
Py_INCREF(Py_None);
return Py_None;
Run Code Online (Sandbox Code Playgroud)
如果省略Py_INCREF(Py_None),会发生什么?
我查看了python的官方文档,但我似乎无法找到参考周期.任何人都可以澄清它对我来说是什么,因为我正在尝试理解GC模块.提前感谢您的回复.
python garbage-collection reference-counting cyclic-reference
objective-c ×3
python ×3
ios5 ×2
.net ×1
c ×1
c# ×1
clr ×1
cocoa ×1
constructor ×1
destructor ×1
ios ×1
iphone ×1
reference ×1
retaincount ×1