【@property参数strong与weak Objective-C语言】

前言

例如,有一个Car类:
#import <Foundation/Foundation.h>

@interface Car : NSObject
@property(nonatomic,assign)int speed;

  • (void)run;
    @end

#import “Car.h”

@implementation Car
– (void)dealloc
{
NSLog(@“车废了。。。”);
}
– (void)run
{
NSLog(@“时速为%d的车,在行驶。。。”,_speed);
}
@end

还有一个Person类:
#import <Foundation/Foundation.h>
#import “Car.h”
@interface Person : NSObject
@property(nonatomic,retain)Car *car;
@end

#import “Person.h”

@implementation Person

@end

一、第一个问题,能用retain吗

1)@property(nonatomic,retain)Car *car;
这句话,能用retain吗?
2)retain参数,能不能在ARC机制下面去使用呢。。。不能,
为什么:
@property(nonatomic,retain)Car car;
/

– (void)setCar:(Car *)car
{
if(_car != car)
{
[_car release];
_car = [car retain];
}
}
*/
3)在ARC的机制下,@property的参数不能使用retain。
因为retain代表生成的setter方法是MRC的标准的内存管理代码。
而我们在ARC的机制下,不需要这些代码

二、ARC机制下的对象的回收的标准,当没有任何强类型的指针指向对象的时候,这个对象就会被立即回收

1.强类型指针 ,弱类型指针

2.什么情况下,叫做对象没有强类型指针指向

1)指向对象的强指针被回收
2)指向对象的强指针被赋值为nil

三、在ARC机制下,@property参数不能使用retain,因为retain代表生成的setter方法是MRC的标准的内存管理代码,而我们在ARC的机制下,不需要这些代码

1)所以,在ARC机制下的setter方法,什么都不需要做,直接赋值就可以了
2)@interface Person:NSObject
{
Car *_car;
}
Person的这个Car指针,是应该为强指针,还是应该为弱指针
很明显,应该为强指针,因为如果为弱指针,人还在呢,车可能就没了
所以,这个Car指针,应该是一个强指针,保证只要Person在,Car指针指向的对象就不会被回收
3)ARC机制下,我们关注的重点
当1个类的属性是OC对象的时候,这个属性应该声明为强类型的还是弱类型的。
很明显,应该声明为一个强类型的。
例如:
@interface Person:NSObject
{
__weak Car *_car;
}
– (void)setCar:(Car *)car;
– (Car *)car;
@end
在Person .m文件中:
#import “Person.h”
@implementation Person
– (void)setCar:(Car *)car
{
_car = car;
}
– (Car *)Car
{
return _car;
}
在main.m文件中:
#import <Foundation/Foundation.h>
#import “Person.h”
int main()
{
Person *p1 = [Person new];
Car *c1 = [Car new];
p1.car = c1 ;
c1 = nil;
}

输出:车挂了。。。

人挂了

这时候,这个Car有几个指针指向它,两个:
a c1这个强指针
b _car属性这个弱指针,
此时,c1被设置成nil,没有强指针指向这辆车了,车挂了。。。但是,人还在,这样就很尴尬了。。。
如果_car属性是个强指针,就算c1等于nil,这个Car对象会不会回收,不会,因为还有一个强指针指向它呢。。。
例如,把Person.h文件改成这样:
#import <Foundation/Foundation.h>
#import “Car.h”
@interface Person : NSObject
{
__strong Car *_car;
}
– (void)setCar:(Car *)car;
– (Car *)car;
@end
这时候,再运行main.m文件,输出如下:

输出:人挂了。。。

车挂了。。。

说明,人挂了之后,车才会挂,所以会不会出现人还在,车挂了的情况啊,不会

四、用@property怎么实现上面的代码

1)@property(nonatomic)Car *car;
我们知道@property是不是生成1个属性啊,它生成的这个属性,是强类型的,还是弱类型的,如何控制@property生成的私有属性,是1个强类型的,还是1个弱类型的呢
2)@property的两个参数strong与weak
@property(nonatomic,strong)Car *car;
代表生成的私有属性_car,是1个强类型的
@property(nonatomic,weak)Car *car;
代表生成的私有属性_car,是1个弱类型的
3)如果不写,默认为strong。

五、使用建议:

1、在ARC的机制下,如果属性的类型,是OC对象类型的,绝大多数场景下,使用strong参数。

2、在ARC的机制下,如果属性的类型,不是OC对象类型的,使用assign

3、strong与weak都是应用在属性的类型是OC对象的时候。。。属性的类型不是OC对象的时候就使用assign

4、在ARC机制下,将MRC下的retain替换为strong,就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值