我经常这样做,
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
beep()
}
Run Code Online (Sandbox Code Playgroud)
在一个应用程序中,我们经常这样做
tickle.fresh(){
msg in
paint()
}
Run Code Online (Sandbox Code Playgroud)
但如果你做这个
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
tickle.fresh(){
msg in
paint()
}
}
Run Code Online (Sandbox Code Playgroud)
当然,你必须做这个
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) { [weak self] _ in
tickle.fresh(){
msg in
self?.paint()
}
}
Run Code Online (Sandbox Code Playgroud)
或者,也许这个
let when = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: when) {
tickle.fresh(){
[weak self] msg in
self?.paint()
}
}
Run Code Online (Sandbox Code Playgroud)
或许这个
let when = DispatchTime.now() …Run Code Online (Sandbox Code Playgroud) 有没有人研究过创建和垃圾收集Java WeakReference对象所涉及的运行时成本?多线程应用程序是否存在任何性能问题(例如争用)?
编辑:显然,实际答案将取决于JVM,但也欢迎一般观察.
编辑2:如果有人对性能做了一些基准测试,或者可以指出一些基准测试结果,那将是理想的.(对不起,但赏金已过期......)
在Objective C中,您可以将属性定义为具有强引用或弱引用,如下所示:
@property(strong)...
@property(weak)...
Run Code Online (Sandbox Code Playgroud)
这怎么做得很快?
考虑参考Josh Smith的文章WPF Apps with Model-View-ViewModel Design Pattern,特别是a的示例实现RelayCommand(图3).(无需阅读整篇文章以了解此问题.)
在一般情况下,我想实现是优秀的,但我有一个代表团的问题CanExecuteChanged订阅到CommandManager的RequerySuggested事件.各州的文件RequerySuggested:
由于此事件是静态的,因此它只会作为弱引用保留在处理程序中.侦听此事件的对象应该对其事件处理程序保持强引用,以避免它被垃圾回收.这可以通过拥有私有字段并在附加到此事件之前或之后将处理程序指定为值来实现.
然而,示例实现RelayCommand不会对订阅的处理程序维护任何此类:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
Run Code Online (Sandbox Code Playgroud)
RelayCommand客户端的漏洞,要求用户RelayCommand了解自己的实施CanExecuteChanged并维护一个实时参考?如果是这样,例如,修改实现RelayCommand类似于以下内容以减轻CanExecuteChanged订户的潜在过早GC 是否有意义:
// This event never actually fires. It's purely lifetime mgm't.
private event EventHandler canExecChangedRef;
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value; …Run Code Online (Sandbox Code Playgroud)如何在ARC下获得一系列归零弱引用?我不希望数组保留对象.我希望数组元素在被释放时自行删除,或者将这些条目设置为nil.
同样,我怎么能用字典做到这一点?我不希望字典保留值.再次,我希望字典元素要么在取消分配值时删除自己,要么将值设置为nil.(我需要保留密钥,这是唯一的标识符,至少在相应的值被释放之前.)
这两个问题涉及类似的问题:
但两者都没有要求归零.
根据文档,NSPointerArray和NSHashMap都不支持ARC下的弱引用.NSValue的nonretainedObjectValue也不起作用,因为它是非归零的.
我看到的唯一解决方案是创建我自己的类似NSValue的包装类,其中包含一个(weak)属性,正如这个答案提到的那样,接近结尾.有没有更好的方式我没有看到?
我正在为OS X 10.7和iOS 6.0开发.
cocoa cocoa-touch weak-references objective-c automatic-ref-counting
还有一个类似的问题这对SO 在这里,但我只是想澄清的东西,并没有完全解释存在.
据我所知,所有代表和出口 - 事实上任何对"父"对象的引用,作为一个好公民,并考虑一分钟的对象图 - 应该归结为弱引用.由于零指针的性质在引用对象的保留计数达到零时自动降至零,这是否意味着现在将IBOutlets设置为nil viewDidUnload是不必要的?
所以,如果我这样宣布我的出口:
@property (nonatomic, weak) IBOutlet UILabel *myLabel;
Run Code Online (Sandbox Code Playgroud)
以下代码是否有效?
- (void)viewDidUnload
{
self.myLabel = nil;
[super viewDidUnload];
}
Run Code Online (Sandbox Code Playgroud) 任何人都可以解释弱引用的用法吗?
该文件没有精确地解释它,它只是说,GC可以摧毁通过随时弱引用链接到对象.那么一个物体可以随时消失的重点是什么?如果我需要在消失后立即使用它怎么办?
能用一些好的例子来解释一下吗?
谢谢
所以我最近一直在考虑一些自动内存管理的想法 - 具体来说,我一直在寻找基于引用计数实现内存管理器.当然,每个人都知道循环引用会杀死天真的引用计数.解决方案:弱引用.就个人而言,我讨厌以这种方式使用弱引用(还有其他更直观的方法来解决这个问题,通过循环检测),但它让我思考:弱引用还有什么用处?
我认为它们必然存在某种原因,特别是在具有跟踪垃圾收集的语言中,它们不会受到循环参考陷阱的影响(C#和Java是我熟悉的,Java甚至有三种弱引用!).但是,当我试图为他们找到一些可靠的用例时,我几乎只有像"使用它们来实现缓存"这样的想法(我已经在SO上看过几次).我也不喜欢它,因为它们依赖于跟踪GC在不再强烈引用之后可能不会立即收集对象的事实,除非在低内存情况下.这些类型的情况对于引用计数GC是完全无效的,因为对象在不再被引用之后立即被销毁(除了可能在循环的情况下).
但这真让我感到疑惑:弱引用怎么可能有用呢?如果你不能指望它引用一个对象,并且它不需要像打破周期那样,那么为什么要使用它?
我试图找出一种方法来typeof创建一个弱的引用,self以便在块中使用,以避免保留周期.
当我第一次读到这个时,似乎是使用惯例__block typeof(self) bself = self;,编译但是使用__block以避免保留周期不再起作用而__weak应该使用.
但是会__weak typeof(self) bself = self;导致错误:
类型'typeof(self)'(又名'TUAccountsViewController*const __strong')已经设置了保留属性
有没有办法使用typeof或其他调用一般创建一个弱引用self?
cocoa weak-references objective-c objective-c-blocks automatic-ref-counting
在Apress Pro Android 4中,作者说过:
当设备旋转时,[...]当前正在运行的活动的上下文将不再有效.[...]一种方法是使用对活动的弱引用而不是硬引用[...]
但是作者只是建议这一点,并没有说明它是如何完成的.谁先做了这个,请举个例子.
weak-references ×10
objective-c ×3
cocoa ×2
java ×2
swift ×2
android ×1
cocoa-touch ×1
iboutlet ×1
icommand ×1
ios ×1
mvvm ×1
python ×1
reference ×1
relaycommand ×1
wpf ×1