标签: weak-references

Lambda Expression导致弱引用的目标不能是GC吗?

namespace Test
{
    class Test
    {
        delegate void HandleMessage(string message);

        public void handleMessage(string message){}

        static void Main(string[] args)
        {
            HandleMessage listener1 = new Test().handleMessage;
            WeakReference w1 = new WeakReference(listener1);

            HandleMessage listener2 = (message) => { };
            WeakReference w2 = new WeakReference(listener2);

            Console.WriteLine("w1.Target:\t[" + w1.Target + "]");
            Console.WriteLine("w2.Target:\t[" + w2.Target + "]");

            listener1 = null;
            listener2 = null;
            GC.Collect();
            Console.WriteLine("after GC");

            Console.WriteLine("w1.Target:\t[" + w1.Target + "]");
            Console.WriteLine("w2.Target:\t[" + w2.Target + "]");

            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

GC后为什么w2.Target不为空?

    w1.Target:      [Test.Test+HandleMessage]
    w2.Target:      [Test.Test+HandleMessage]
    after …

.net lambda weak-references

2
推荐指数
1
解决办法
1038
查看次数

如何在C++中维护一个指向父类的弱指针?

是否有一种标准方法可以在C++中的子对象中维护指向父对象(使用共享指针创建)的弱指针?

从本质上讲,我需要实现以下几点:

Class B;

Class A
{

...
private:
B m_b;
};

Class B
{
....
public:
void SetParentPtr(const boost::shared_ptr<A>& a)
{
m_parentPtr = a;
}
private:
boost::weak_ptr<A> m_parentPtr;
};
Run Code Online (Sandbox Code Playgroud)

在上面,B类的所有实例都需要保存一个指向其父级的弱指针(即A类的对象).使用shared_ptr实例化A类对象.我可以想到一个使用空删除器的解决方案.但这是做这样的事情的标准方式吗?

c++ weak-references smart-pointers

2
推荐指数
1
解决办法
1954
查看次数

WeakReferences的HashMap,用于在活动之间传递数据

我特别感兴趣的是官方android FAQ中的以下建议.

WeakReferences对象的HashMap

您还可以使用WeakReferences的HashMap到具有长键的对象.当活动想要将对象传递给另一个活动时,它只是将对象放入地图中,并通过意图附加功能将密钥(基于计数器或时间戳的唯一Long)发送给收件人活动.收件人活动使用此密钥检索对象

我还没有找到如何正确实现这一点的方法.我不确定为什么WeakReferences在这里是首选,为什么不使用硬引用.

我的实现(我想从活动A服务B发送类XY的实例):

代码使用硬引用.我为什么要在这里使用弱引用(如FAQ所提出的)?并且这样的使用模式可以传递数据,或者您更喜欢其他内容.

android communication weak-references hashmap

2
推荐指数
1
解决办法
3792
查看次数

使用运行时将弱ivar添加到Objective-C类

是否可以在使用运行时创建的类中添加归零弱引用(在ARC意义上,而不是GC中)实例变量?如果是这样的话?

有一个函数调用class_setWeakIvarLayout()似乎与此相关,但遗憾的是文档(对于此函数和非弱对应函数)都非常薄.

weak-references objective-c objective-c-runtime automatic-ref-counting

2
推荐指数
1
解决办法
1470
查看次数

Java Finalizer方法和GC

我创建了一个对象,其finalize方法已被覆盖,以保存和关闭具有一些信息的文件.该对象是从另一个对象引用的弱对象.我希望在GC发生时保存对象的一些更改.这就是为什么我覆盖了finalize的代码.

但是,当一个对象即将收集垃圾时调用finalize方法.这可以在它有资格进行垃圾收集之后的任何时间.

我不想要这个,我想在GC发生时立即调用finalize方法,并且不应该有任何延迟.有没有我可以设置的jvm选项来实现这个?我只能看到另一种方法是"System.runFinalization()",但这看起来很俗气?有更优雅的方式吗?

谢谢

java garbage-collection weak-references finalize

2
推荐指数
1
解决办法
288
查看次数

Objective-C运行时如何知道弱引用对象是否仍然存活?

随着ARC的出现,一些新功能可供开发人员使用弱引用对象.id objc_loadWeak(id *location)是其中之一.此函数接收一个参数,该参数对应于存储弱对象的内存中的某个位置,如果该对象仍处于活动状态或nil已取消分配,则返回该对象.

似乎当一个对象obj被存储weak在一个位置locationid objc_storeWeak(id *location, id obj),obj被放在一个"弱地图"中,location作为一个键.但是,为了检索obj,objc_loadWeak不仅可以location用作键并返回值,这对应于obj.它还必须检查是否obj仍然存活,nil如果不再存在则返回.

但是,objc_loadWeak无法尝试读取对象的保留计数,因为该对象可能已被释放.此外,尽管弱地图,objc_storeWeak,objc_loadWeakNSObject类以相同的文件(实施NSObject.mm)NSObjectdealloc方法没有信号给正被释放的对象消失弱地图.

那么,Objective-C运行时如何判断一个weak对象是否还活着?

weak-references objective-c objective-c-runtime automatic-ref-counting

2
推荐指数
1
解决办法
938
查看次数

如何在Java中正确创建对方法引用的弱引用

我想一个JavaFX注册ListChangeListener一个ObservableList.但是我注意到,在某些情况下,监听器没有被调用.

(1)如果监听器是方法参考,一切都有效:

// using a direct method reference:
private final ListChangeListener<String> listener = this::listDidChange;

/* ... */
public void init() {
    list.addListener(listener);
}
Run Code Online (Sandbox Code Playgroud)

(2)但是如果Listener是同一方法的弱引用,则不调用监听器:

// using a weak method reference:
private final ListChangeListener<String> listener = new WeakListChangeListener<String>(this::listDidChange);

/* ... */
public void init() {
    list.addListener(listener);
}
Run Code Online (Sandbox Code Playgroud)

(3)现在真正有趣的部分是,它再次起作用,即使它应该与前面的例子相同:

// direct method reference wrapped into a weak ref later:
private final ListChangeListener<String> listener = this::listDidChange;

/* ... */
public void init() {
    list.addListener(new WeakListChangeListener<String>(listener));
} …
Run Code Online (Sandbox Code Playgroud)

java lambda javafx weak-references

2
推荐指数
1
解决办法
891
查看次数

如何在clang中使用__weak引用?

我写了一个简单的OC文件来测试__weak参考

#import "Foundation/Foundation.h"

@interface Foo : NSObject
@property (nonatomic, assign) int a;
- (void)test;
@end

@implementation Foo
- (void)test
{
    __weak typeof(self) weakSelf = self;
    [weakSelf test];
}

@end

int main()
{
    Foo* foo = [[Foo alloc] init];
    foo.a = 3;
    [foo test];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译clang -rewrite-objc keke.m我得到以下错误:

无法创建__weak引用,因为当前部署目标不支持弱引用__attribute __((objc_ownership(weak)))typeof(self)weakSelf = self;

我怎样才能直接设置depoly目标clang.我试过了

clang -rewrite-objc -stdlib=libc++ -mmacosx-version-min=10.7 keke.m
Run Code Online (Sandbox Code Playgroud)

但没有运气.

weak-references objective-c clang

2
推荐指数
1
解决办法
1433
查看次数

为什么Xcode没有让出口无主而不是弱?

Xcode通过隐式展开产生出口作为弱变量,如下所示:

@IBOutlet weak var nameTextField: UITextField!
Run Code Online (Sandbox Code Playgroud)

我想知道它为什么不只是制作onowned var,在我的理解中 - 行为完全相同,但保持类型不可选.这两者有什么区别吗?

weak var foo: UITextField!
unowned var foo: UITextField
Run Code Online (Sandbox Code Playgroud)

xcode weak-references iboutlet ios swift

2
推荐指数
1
解决办法
590
查看次数

Java WeakHashMap何时清除null键?

在下面的代码nameRef.get()是null,之后name = nullSystem.gc().

import java.lang.ref.WeakReference;

public class Main {

    public static void main(String[] args) {
        String name = new String("ltt");

        WeakReference<String> nameRef = new WeakReference<>(name);    
        System.out.println(nameRef.get()); // ltt

        name = null;
        System.gc();

        System.out.println(nameRef.get());  // null
    }    
}
Run Code Online (Sandbox Code Playgroud)

WeakHashMap基于WeakReference.最后,我认为map.size()将是0.事实上,它是1.

import java.util.WeakHashMap;

public class Main2 {

    public static void main(String[] args) {
        String name = new String("ltt");
        WeakHashMap<String, Integer> map = new WeakHashMap<>();
        map.put(name, 18);
        System.out.println(map.size()); // 1

        name = null;
        System.gc();

        System.out.println(map.size());  // …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection weak-references weakhashmap

2
推荐指数
2
解决办法
208
查看次数