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 … 是否有一种标准方法可以在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类对象.我可以想到一个使用空删除器的解决方案.但这是做这样的事情的标准方式吗?
我特别感兴趣的是官方android FAQ中的以下建议.
WeakReferences对象的HashMap
您还可以使用WeakReferences的HashMap到具有长键的对象.当活动想要将对象传递给另一个活动时,它只是将对象放入地图中,并通过意图附加功能将密钥(基于计数器或时间戳的唯一Long)发送给收件人活动.收件人活动使用此密钥检索对象
我还没有找到如何正确实现这一点的方法.我不确定为什么WeakReferences在这里是首选,为什么不使用硬引用.
我的实现(我想从活动A向服务B发送类XY的实例):
接收服务有一个静态的HashMap对象.
public static HashMap<Long, Object> parameters = new HashMap<Long, Object>();
Run Code Online (Sandbox Code Playgroud)发送部分的代码(活动A)
long key = SystemClock.elapsedRealtime();
B.parameters.put(key, new XY());
Intent i = new Intent(this, B.class);
i.putExtra("PARAM_UPLOAD", key);
startService(i);
Run Code Online (Sandbox Code Playgroud)接收部分的代码(服务B)
long key = intent.getLongExtra("PARAM_UPLOAD", -1);
XY data = (XY)parameters.get(key);
Run Code Online (Sandbox Code Playgroud)代码使用硬引用.我为什么要在这里使用弱引用(如FAQ所提出的)?并且这样的使用模式可以传递数据,或者您更喜欢其他内容.
是否可以在使用运行时创建的类中添加归零弱引用(在ARC意义上,而不是GC中)实例变量?如果是这样的话?
有一个函数调用class_setWeakIvarLayout()似乎与此相关,但遗憾的是文档(对于此函数和非弱对应函数)都非常薄.
weak-references objective-c objective-c-runtime automatic-ref-counting
我创建了一个对象,其finalize方法已被覆盖,以保存和关闭具有一些信息的文件.该对象是从另一个对象引用的弱对象.我希望在GC发生时保存对象的一些更改.这就是为什么我覆盖了finalize的代码.
但是,当一个对象即将收集垃圾时调用finalize方法.这可以在它有资格进行垃圾收集之后的任何时间.
我不想要这个,我想在GC发生时立即调用finalize方法,并且不应该有任何延迟.有没有我可以设置的jvm选项来实现这个?我只能看到另一种方法是"System.runFinalization()",但这看起来很俗气?有更优雅的方式吗?
谢谢
随着ARC的出现,一些新功能可供开发人员使用弱引用对象.id objc_loadWeak(id *location)是其中之一.此函数接收一个参数,该参数对应于存储弱对象的内存中的某个位置,如果该对象仍处于活动状态或nil已取消分配,则返回该对象.
似乎当一个对象obj被存储weak在一个位置location时id objc_storeWeak(id *location, id obj),obj被放在一个"弱地图"中,location作为一个键.但是,为了检索obj,objc_loadWeak不仅可以location用作键并返回值,这对应于obj.它还必须检查是否obj仍然存活,nil如果不再存在则返回.
但是,objc_loadWeak无法尝试读取对象的保留计数,因为该对象可能已被释放.此外,尽管弱地图,objc_storeWeak,objc_loadWeak和NSObject类以相同的文件(实施NSObject.mm)NSObject的dealloc方法没有信号给正被释放的对象消失弱地图.
那么,Objective-C运行时如何判断一个weak对象是否还活着?
weak-references objective-c objective-c-runtime automatic-ref-counting
我想一个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) 我写了一个简单的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)
但没有运气.
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) 在下面的代码nameRef.get()是null,之后name = null和System.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)