再论strong 和weak的区别

首先看一篇文章

作者:新风作浪

原文网址:http://blog.youkuaiyun.com/duxinfeng2010/article/details/8461784

原文部分内容

weak and strong property (强引用和弱引用的区别)

 weak 和 strong 属性只有在你打开ARC时才会被要求使用,这时你是不能使用retain release autorelease 操作的,因为ARC会自动为你做好这些操作,但是你需要在对象属性上使用weak 和strong,其中strong就相当于retain属性,而weak相当于assign。

只有一种情况你需要使用weak(默认是strong),就是为了避免retain cycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)

ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。
该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 以后可以使用该特性。



property 中的strong 与weak


strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切

@property (nonatomic, strong) NSString *string1; 

@property (nonatomic, strong) NSString *string2; 


有这样两个属性,


@synthesize string1; 

@synthesize string2; 
猜一下下面代码将输出什么结果?
self.string1 = @"String 1"; 

self.string2 = self.string1; 

self.string1 = nil; 
NSLog(@"String 2 = %@", self.string2); 
结果是:String 2 = String 1
由于string2是strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。

接着我们来看weak关键字:
如果这样声明两个属性:
@property (nonatomic, strong) NSString *string1; 

@property (nonatomic, weak) NSString *string2; 
并定义 

@synthesize string1; 

@synthesize string2; 


再来猜一下,下面输出是什么?


self.string1 = @"String 1"; 

self.string2 = self.string1; 

self.string1 = nil; 

NSLog(@"String 2 = %@", self.string2); 


结果是:String 2 = null


分析一下,由于self.string1与self.string2指向同一地址,且string2没有retain内存地址,而self.string1=nil释放了内存,所以string1为nil。声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样的好处能有效的防止野指针。在c/c++开发过程中,为何大牛都说指针的空间释放了后,都要将指针赋为NULL. 在这儿用weak关键字帮我们做了这一步。




我的观点:我在xcode试验了,不论属性之前的关键字设为什么,后面的打印都是string1,似乎作者表述不正确,还是别处不了问题。

请看下面的图

string2属性设置为weak


改为strong后





### 关于分布焦点损失的研究 分布焦点损失(Distribution Focal Loss, DFL)是一种用于目标检测中的新型损失函数设计方法,其主要目的是通过优化预测框的位置回归来提升模型性能。以下是与该主题相关的研究及其背景: #### Distribution Focal Loss 的起源与发展 DFL 是一种基于概率分布建模的方法,它将边界框的坐标视为离散的概率分布而不是单一数值[^4]。这种方法能够更好地捕捉位置不确定性并减少梯度消失问题。具体而言,在 YOLOv8 中引入了类似的机制以增强定位精度。 #### 论文中提到的相关工作 - **Localization Distillation for Dense Object Detection**: 此论文探讨了如何利用知识蒸馏技术改善密集物体检测器的表现,其中涉及到了一些先进的损失函数设计理念[^1]。 - **Strong-Weak Distribution Alignment for Adaptive Object Detection**: 提出了强弱分布对齐策略适应不同领域间的数据差异,虽然未直接提及 DFL,但它强调了跨域自适应过程中合理定义损失的重要性[^2]。 - **IoU 最新损失函数改进**:一篇发表于 2024 年初的文章讨论了几种新颖的 IoU 类型损失函数 (如 EIoU CIoU),这些都可以看作是对传统 DFL 思想的一种延续发展[^3]。 - **Focaler-IoU 在 YOLO 系列上的应用**:两篇分别针对 YOLOv8 YOLOv10 的改进文章展示了如何结合定制化版本的 DFL 来进一步提高模型效果[^5]。例如,“Focaler_CIoU Loss”就是这样一个融合实例。 ```python def compute_focal_distribution_loss(pred_dist, target_dist, gamma=2.0, alpha=0.25): """ Compute the distribution focal loss between predicted and target distributions. Args: pred_dist (Tensor): Predicted probability distribution. target_dist (Tensor): Ground truth probability distribution. gamma (float): Modulating factor to reduce easy example contribution. alpha (float): Weighting parameter balancing positive/negative samples. Returns: Tensor: Computed loss value. """ ce_loss = -(target_dist * torch.log_softmax(pred_dist, dim=-1)).sum(dim=-1) pt = torch.exp(-ce_loss) focal_weight = (alpha * (1 - pt)**gamma).unsqueeze(1) return (focal_weight * ce_loss).mean() ``` 上述代码片段展示了一个简化版的实现方式,可用于理解 DFL 的基本原理。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值