part1:再论NSString属性的三观

本文探讨了NSString属性在Objective-C中的不同设置方式,包括strong和copy的区别,并通过实例演示了它们如何影响不可变与可变字符串。

最近在开发过程中看到了针对NSString属性的各种写法,包括我自己,痛定思痛,决定写一遍文章出来摆正三观。

先说说我在项目中看到的对NSString属性的写法:

1. @property(nonatomic,strong)NSString *tmpStr;

  - (void)xxxFunc:(NSString *)str

  {

      //_tmpStr = str;     // 写法1

      //self.tmpStr = str; // 写法2

      //

  }

2. @property(nonatomic,copyNSString *tmpStr;

  - (void)xxxFunc:(NSString *)str

  {

      //_tmpStr = str;     // 写法1

      //self.tmpStr = str; // 写法2

      //

  }

 NSString为不可变类型,而NSMutableString为可变类型,那么使用strong和copy到底有什么区别呢?

 1. 使用strong,表明该变量拥有所有权,而这个属性就有可能指向一个可变对象,如果这个可变对象在外部修改了,那么会影响该属性

 2. 使用copy, 表明该变量不受外部影响,本身持有一个不可变副本,即使传入的是一个可变对象


 具体代码如下:

   1. @property (nonatomic,strong)NSString *string;

      

    NSLog(@"modify string before");

    NSMutableString *mutableStr = [@"mutablestring"mutableCopy];

    [selftestString:mutableStr];

    

    NSLog(@"modify string after");

    [mutableStr appendString:@" modify"];

    NSLog(@"%@",self.string);


    -(void)testString:(NSString *)str

    {

        self.string = str;

        NSLog(@"%@",self.string);

    }

    

    结果是什么呢?? 很清楚的看到,即使你声明了NSString的不可变类型,但是还是被外部给影响了。那么如果self.string = str;改成_string = str;结果还是一样

    

2016-09-07 10:57:59.804 testFunctionString[1373:73860] modify string before

2016-09-07 10:57:59.804 testFunctionString[1373:73860] mutablestring

2016-09-07 10:57:59.804 testFunctionString[1373:73860] modify string after

2016-09-07 10:57:59.804 testFunctionString[1373:73860] mutable string modify


   2@property (nonatomic,copyNSString *string; 

      其余不变,运行代码,可以看到结果如下:可以看到NSString的对象不受外部的影响

 

2016-09-07 11:02:57.164 testFunctionString[1385:76130] modify string before

2016-09-07 11:02:57.164 testFunctionString[1385:76130] mutablestring

2016-09-07 11:02:57.165 testFunctionString[1385:76130] modify string after

2016-09-07 11:02:57.165 testFunctionString[1385:76130] mutable string


   3. 如果在2的基础我,修改self.string = str;为_string = str;会咋样呢:

     继续运行程序,得出的结果如下:可以看到结果被改变了

    

2016-09-07 11:04:52.928 testFunctionString[1396:77501] modify string before

2016-09-07 11:04:52.928 testFunctionString[1396:77501] mutablestring

2016-09-07 11:04:52.928 testFunctionString[1396:77501] modify string after

2016-09-07 11:04:52.928 testFunctionString[1396:77501] mutable string modify


总结:

   1. 对于不可变对象,使用copy来防止改变结果,因为copy返回的是不可变对象,同时使用setter方法来赋变量,否则都危险

   2. 对于可变对象,使用strong来拥有所有权

   3. 对于可变对象,使用copy后,不能调用addobject等可变对象的函数,否则崩溃


内容概要:本文介绍了基于改进Retinex算法的视频图像增强技术研究,并提供了相应的Matlab代码实现。Retinex理论源于人类视觉系统对光照变化的适应性,通过分离图像的照度与反射分量,有效提升图像的亮度、对比度和色彩保真度。文中所提出的改进算法旨在克服传统Retinex方法中存在的光晕伪影、噪声放大和计算复杂等问题,可能引入了如多尺度分解、颜色校正或自适应滤波等优化策略,从而实现更自然、清晰的图像增强效果。该研究特别适用于低光照、雾霾、水下拍摄等恶劣成像条件下的视频与图像处理,提升后续视觉分析的准确性。; 适合人群:具备一定图像处理基础和Matlab编程经验的科研人员、研究生及工程技术人员,尤其是从事计算机视觉、视频监控、遥感影像、医学影像或无人机视觉导航等领域研究的专业人士。; 使用场景及目标:① 解决实际应用中因光照不足或环境干扰导致的图像质量下降问题;② 学习和掌握Retinex算法的核心思想及其改进方法;③ 获取可直接运行和调试的Matlab代码,作为相关课题研究或项目开发的技术参考。; 阅读建议:此资源以Matlab代码实现为核心,建议读者在阅读时结合代码逐行分析,理解算法的每一步实现细节。同时,应尝试使用不同的测试图像进行实验,调整算法参数,观察增强效果的变化,从而深入理解算法的性能特点和优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值