@propeerty中retain assign copy weak strong

本文详细介绍了Objective-C中retain、assign、copy以及strong和weak关键字在@property中的应用,并通过实例展示了不同内存管理方式的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

retain assign copy@propeerty中的使用实际上是通过控制set方法进行内存管理。

下面详细介绍:

1.retain

例如:

@class Dog

@propertynonatomicretain Dog *dog

注:nonatomicatomic相对应,涉及线程,比较麻烦,这里不做赘述,读者仅需记住,nonatomic相对于atomic来说性能高,而声明属性时一般默认为atomic,故需在此申明nonatomic,这里使用了retain,那么在set方法中,究竟如何体现的呢?

- (void)setDog:(Dog *)dog

{

  if(_dog != dog){          //判断是否需要重新赋值

     [_dog release];        //释放旧引用,计数器-1

     _dog = [dog retain];   //重新赋值,计数器+1

   }

}


2.assign

 例如:

  @propertynonatomicassignint count

这里使用了assign,那么在set方法中,究竟如何体现的呢?

- (void)setCount:(int)count 

{

  _count = count;

}


3.copy

  例如:

       @propertynonatomiccopyNSString * str

这里使用了copy,那么在set方法中,究竟如何体现的呢?

- (void)setStr:(NSString *)str

{

 if(_str != str){          //判断是否需要重新赋值

     [_str release];        //释放旧引用,计数器-1

     _str = [str copy];   //重新赋值,使用copy

   }

}

总结:

    1.retain:先release旧值,再retain新值,在上例中_dogdog最终指向同一快内存区域。

    2.assign:直接赋值,不考虑内存管理。

    3.copy:先release旧值,再copy新值,copy的本质为复制该内存所存储的内容,重新创建一个对象赋给其相同的内容,很明显,在copy这个过程中也发生了一次retain,不过这是个全新的对象。在上例中,_strstr最终指向了不同的内存区域,但其内容一样。


property 中的strong weak

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

 例如:

<span style="font-size:12px;">@property (nonatomic, strong) NSString*string1;  
@property (nonatomic, strong) NSString*string2; 

self.string1 = @"String 1";  
self.string2 = self.string1;  
self.string1 = nil; 
NSLog(@"String 2 = %@",self.string2); </span>

结果是:

<span style="font-size:12px;">String 2 = String 1</span>

分析:

由于string2strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。

 

5.weak关键字:


@property (nonatomic, strong) NSString*string1;  
@property (nonatomic, weak) NSString*string2; 
 
self.string1 = @"String 1";  
self.string2 = self.string1;  
self.string1 = nil; 
NSLog(@"String 2 = %@",self.string2); 
 

结果是:

String 2 = null

分析一下

由于self.string1self.string2指向同一地址,且string2没有retain内存地址,而self.string1=nil释放了内存,所以string1nil

声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样的好处能有效的防止野指针。在c/c++开发过程中,为何大牛都说指针的空间释放了后,都要将指针赋为NULL. 在这儿用weak关键字帮我们做了这一步。


资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项目展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值