在纯function语言中,数据是不可变的。 通过引用计数,创build参考周期需要更改已经创build的数据。 似乎纯粹的function语言可以使用引用计数,而不用担心循环的可能性。 我是对的? 如果是这样,他们为什么不呢? 我知道引用计数在许多情况下比GC慢,但至less减less了停顿时间。 在暂停时间不好的情况下,可以select使用参考计数。
在iOS项目中使用新的自动引用计数(ARC)内存pipe理风格有哪些优缺点? 你可以select在使用iOS 5.0 SDK进行开发时不使用ARC吗? 您是否推荐ARC或手动引用计数(MRC)用于新项目? 使用ARC的应用程序是否能够在比iOS 5.0更早的操作系统版本上运行?
我来自C ++背景,我已经使用C#大约一年。 像许多其他人一样,为了确定性的资源pipe理为什么没有内置于语言中,我却不知所措。 而不是确定性的析构函数,我们有处理模式。 人们开始怀疑是否通过他们的代码传播一次性使用癌症是值得的。 在我的C ++偏见的大脑中,似乎使用引用计数智能指针与确定性析构函数是从垃圾回收器,要求您实现IDisposable和调用处置来清理您的非内存资源的重大一步。 诚然,我不是很聪明…所以我纯粹是从一个渴望更好地理解为什么事情是这样的欲望这个问。 如果C#被修改,那么: 对象是引用计数。 当对象的引用计数变为零时,将在对象上确定性地调用资源清理方法,然后将该对象标记为垃圾回收。 垃圾收集发生在未来的某个非确定性时间,回收内存。 在这种情况下,您不必实现IDisposable或记得调用Dispose。 如果要释放非内存资源,只需实施资源清理function即可。 为什么这是一个坏主意? 这会打败垃圾收集器的目的吗? 实施这样的事情是否可行? 编辑:从目前为止,这是一个糟糕的主意,因为 无需参考计数,GC更快 在对象图中处理周期的问题 我认为第一是有效的,但是第二很容易处理使用弱引用。 那么速度优化大于你的缺点: 不能及时释放非内存资源 可能会很快释放一个非内存资源 如果你的资源清理机制是确定性的,并且内置在语言中,你可以消除这些可能性。
我很好奇python中__del__的细节,什么时候以及为什么它应该被使用,什么不应该被使用。 我已经学会了这样一个艰难的方式,它不是真正的天真地期望从析构函数中得到什么,因为它不是__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() 我在文档中看到, 不保证__del__()方法在解释器退出时仍然存在的对象被调用。 […]
一个简单的问题。 如果我有一个财产和一个同名的伊娃: 在.h文件中: (Reminder*)reminder; @property(nonatomic,strong)(Reminder*)reminder; 在.m文件中,如果我正在使用ARC,应该在init方法中使用ivar还是属性? – (id)initWithReminder:(Reminder*)reminder_ { self = [super init]; if (self) { reminder = reminder_; } return self; } 或者,我应该使用该属性来获得像这样的自动引用计数的好处: – (id)initWithReminder:(Reminder*)reminder_ { self = [super init]; if (self) { self.reminder = reminder_; } return self; } 我不确定在对象初始化的哪一点,属性可以用点符号来访问。
我有点固执,但是我想很好地理解弱和强的引用,所以我再次问你。 考虑这个: __weak NSString* mySecondPointer = myText; NSLog(@"myText: %@", myText); 结果是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); […]
在我的init方法中使用点符号来初始化retain属性为零是不是一个好主意? 有了这样的普通财产: @property (nonatomic, retain) id foo; 说我在init方法中设置self.foo = nil 。 合成的方法首先释放或自动释放foo (不完全确定潜在的障碍)。 在第一次接电话或接电话之前, foo保证是零吗? 或者它会指向随机垃圾,除非我明确地设置foo = nil没有点符号?