我正在阅读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
有人能解释一下C#中不同类型引用的主要好处吗?
我们有一个消耗大量内存的应用程序,我们正在尝试确定这是否是一个需要关注的领域.
来自J. Bloch
内存泄漏的来源是监听器......确保回调被及时垃圾回收的最佳方法是仅存储对它们的弱引用,例如,通过仅将它们存储为WeakHashMap中的键 .
那么,为什么Java Collections框架中没有任何WeakSet ?
将听众保持为WeakReferences的利弊是什么.
当然,最大的'专业'是:
将侦听器添加为WeakReference意味着侦听器不需要打扰"删除"自身.
更新
对于那些担心只有对象引用的侦听器,为什么有2个方法,addListener()和addWeakRefListener()?
那些不关心去除的人可以使用后者.
当我weak在Swift中声明变量时,我有时会收到来自Xcode的错误消息:
'weak'可能只适用于类和类绑定协议类型
我只是想知道为什么关键字weak只能应用于类和类绑定协议类型?它背后的原因是什么?
我知道有一个WeakHashMapin java.util,但由于它只使用了WeakReferences,只有这个Map引用,引用的对象将在下一个GC循环中丢失.因此,如果您想要缓存随机数据,这几乎是无用的,这很可能会再次被请求而不会在其余时间进行硬链接.最好的解决方案是使用SoftReferences代替的地图,但我没有在Java RT Package中找到一个.
Java的WeakHashMap经常被认为对缓存很有用.虽然它的弱引用是根据地图的键而不是它的值来定义的,但这似乎很奇怪.我的意思是,这是我想要缓存的值,除了缓存之外没有其他人强烈引用它们,我想要收集垃圾,不是吗?
以哪种方式有助于保持对密钥的弱引用?如果你这样做ExpensiveObject o = weakHashMap.get("some_key"),那么我希望缓存保持为'o',直到调用者不再持有强引用,并且我根本不关心字符串对象"some_key".
我错过了什么吗?
我理解如何使用weak_ptr和shared_ptr.我shared_ptr通过计算其对象中的引用数来理解它是如何工作的.weak_ptr工作怎么样?我尝试阅读boost源代码,并且我不熟悉boost以了解它使用的所有内容.
谢谢.
我对android中这种简单的常见情况有疑问.
我们有一个主要的活动,我们调用AsyncTask以及mainactivity的引用,以便AsyncTask可以更新MainActivity上的视图.
我将把事件分解为几步
上面的解决方案是按照"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会发生什么?
谢谢,我为问题的长度道歉.
我读了很多关于__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 ×10
java ×5
android ×1
boost ×1
c# ×1
c++ ×1
caching ×1
collections ×1
hashmap ×1
ios ×1
memory ×1
objective-c ×1
ownership ×1
reference ×1
retain-cycle ×1
swift ×1
tr1 ×1
variables ×1
weak-ptr ×1
winforms ×1