标签: weak-references

__weak和__block引用有什么区别?

我正在阅读Xcode的文档,这里有些令我困惑的事情:

__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
    [tmpSelf doSomething];
}];
Run Code Online (Sandbox Code Playgroud)

从文档中复制以下内容:

块形成对其捕获的变量的强引用.如果self在块中使用 ,则块形成强引用self,因此如果 self还具有对块的强引用(通常它具有),则会产生强引用循环.要避免循环,您需要__block在块外部创建一个弱(或)引用,如上例所示.

我不明白'弱(或__block)'是什么意思?

__block typeof(self) tmpSelf = self;
Run Code Online (Sandbox Code Playgroud)

__weak typeof(self) tmpSelf = self;
Run Code Online (Sandbox Code Playgroud)

这里完全一样吗?

我在文件中找到了另一篇文章:

注意:在垃圾收集环境中,如果将两个__weak__block修饰符都应用于变量,则该块将无法确保它保持活动状态.

所以,我完全不解.

memory-management weak-references objective-c ownership objective-c-blocks

77
推荐指数
2
解决办法
3万
查看次数

参考利益微弱

有人能解释一下C#中不同类型引用的主要好处吗?

  • 弱参考
  • 软参考
  • 幻影参考
  • 强烈的参考.

我们有一个消耗大量内存的应用程序,我们正在尝试确定这是否是一个需要关注的领域.

c# memory reference weak-references winforms

73
推荐指数
3
解决办法
3万
查看次数

为什么存在WeakHashMap,但缺少WeakSet?

来自J. Bloch

内存泄漏的来源是监听器......确保回调被及时垃圾回收的最佳方法是仅存储对它们的弱引用,例如,通过仅将它们存储为WeakHashMap中的键 .

那么,为什么Java Collections框架中没有任何WeakSet ?

java collections garbage-collection weak-references

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

听众作为弱点的利弊

将听众保持为WeakReferences的利弊是什么.

当然,最大的'专业'是:

将侦听器添加为WeakReference意味着侦听器不需要打扰"删除"自身.

更新

对于那些担心只有对象引用的侦听器,为什么有2个方法,addListener()和addWeakRefListener()?

那些不关心去除的人可以使用后者.

java design-patterns weak-references observer-pattern

70
推荐指数
5
解决办法
2万
查看次数

为什么关键字"weak"只能应用于类和类绑定协议类型

当我weak在Swift中声明变量时,我有时会收到来自Xcode的错误消息:

'weak'可能只适用于类和类绑定协议类型

我只是想知道为什么关键字weak只能应用于类和类绑定协议类型?它背后的原因是什么?

variables weak-references swift

65
推荐指数
5
解决办法
3万
查看次数

Java中有SoftHashMap吗?

我知道有一个WeakHashMapin java.util,但由于它只使用了WeakReferences,只有这个Map引用,引用的对象将在下一个GC循环中丢失.因此,如果您想要缓存随机数据,这几乎是无用的,这很可能会再次被请求而不会在其余时间进行硬链接.最好的解决方案是使用SoftReferences代替的地图,但我没有在Java RT Package中找到一个.

java weak-references hashmap soft-references

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

Java的WeakHashMap和缓存:为什么它引用了键而不是值?

Java的WeakHashMap经常被认为对缓存很有用.虽然它的弱引用是根据地图的键而不是它的值来定义的,但这似乎很奇怪.我的意思是,这是我想要缓存的值,除了缓存之外没有其他人强烈引用它们,我想要收集垃圾,不是吗?

以哪种方式有助于保持对密钥的弱引用?如果你这样做ExpensiveObject o = weakHashMap.get("some_key"),那么我希望缓存保持为'o',直到调用者不再持有强引用,并且我根本不关心字符串对象"some_key".

我错过了什么吗?

java caching weak-references

63
推荐指数
4
解决办法
2万
查看次数

weak_ptr如何工作?

我理解如何使用weak_ptrshared_ptr.我shared_ptr通过计算其对象中的引用数来理解它是如何工作的.weak_ptr工作怎么样?我尝试阅读boost源代码,并且我不熟悉boost以了解它使用的所有内容.

谢谢.

c++ boost weak-references tr1 weak-ptr

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

android中的WeakReference/AsyncTask模式

我对android中这种简单的常见情况有疑问.

我们有一个主要的活动,我们调用AsyncTask以及mainactivity的引用,以便AsyncTask可以更新MainActivity上的视图.

我将把事件分解为几步

  • MainActivity创建一个AyncTask,将其引用传递给它.
  • AysncTask,启动它的工作,例如下载十个文件
  • 用户更改了设备的方向.这会在AsyncTask中生成一个孤立指针
  • 当AsyncTask完成并尝试访问活动以更新状态时,由于空指针,它会崩溃.

上面的解决方案是按照"Pro Android 4"一书的建议在AsyncTask中保留WeakReference.

WeakReference<Activity> weakActivity;

in method onPostExecute

Activity activity = weakActivity.get();
if (activity != null) {
   // do your stuff with activity here
}
Run Code Online (Sandbox Code Playgroud)

这是如何解决这种情况的?

我的问题是,如果我的asynctask正在下载10个文件,并且在完成5后重新启动活动(因为方向改变),那么我的FileDownloadingTask会再次被调用吗?

最初调用的先前AsyncTask会发生什么?

谢谢,我为问题的长度道歉.

java android weak-references android-asynctask

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

在dispatch_async函数中使用弱自我

我读了很多关于__weak self在里面使用的帖子dispatch_async,现在我有点困惑.

如果我有 :

self.myQueue = dispatch_queue_create("com.biview.core_data", NULL);

dispatch_async(self.myQueue, ^(void){
    if (!self.var1) {
        self.var1 = ...;
    }
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        if ([self.var2 superview]) {
            [self.var2 removeFromSuperview];
        }

        [self.Label setText:text];
    });
});
Run Code Online (Sandbox Code Playgroud)

我需要使用吗__weak self?因为我读过在某些情况下dispatch_async 不需要__weak self.

请参阅此处的最新评论

weak-references ios objective-c-blocks retain-cycle

52
推荐指数
2
解决办法
3万
查看次数