@property相关知识点

本文探讨了Objective-C中@property的相关知识点,包括属性关键字、如何使用copy修饰符、setter的重写以及@property的本质。编译器会根据@property自动合成getter和setter方法,以及相应的实例变量。但特定条件下,如重写getter和setter、使用dynamic或在协议中定义属性时,不会自动合成。此外,详细阐述了@synthesize的规则和实例变量的生成逻辑。

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

@property有哪些属性关键字?

 

readonly只读
assign单纯赋值(非对象类型使用)
unsafe_unretained单纯赋值 (对象类型使用)
retain进行对象保持操作
strong同retain 用于ARC
weak不进行对象保持操作,同时访问安全的 用于ARC
copy复制对象 (生成副本进行赋值,但只适用于遵循NSCopying协议的对象)
nonatomic非原子操作,非线程安全

atomic

原子操作,主要是在getter和setter方法里面加锁

如何让自己的类用copy修饰符?

1、需要声明该类遵循NSCopying协议

2、实现NSCopying协议里的方法,只有一个方法

- (instancetype)copyWithZone:(NSZone *)zone
{
    XXModel *model = [[[self class] allocWithZone:zone] init];
    model.name = self.name;
    model.size = self.size;
    model.objModelArray = [self.objModelArray mutableCopy];

    // 有可能还需要进行深拷贝
    return model;
}

如何重写带copy关键字的setter

-  (void)setName:(NSString *)name
{
    _name = [name copy];
}

@property的本质是什么?

getter+setter

作用:封装对象中的数据

编译器会自动帮你生成一套存取的方法

ivar、getter,setter是如何生成并添加到这个类中的?

编译器在编译期间自动合成,当你完成属性的定义后,编译器会自动编写访问这个属性所需要的方法。

这个过程除了生成getter、setter之外,编译器还要自动为类添加合适类型的实例变量(以_属性名开头,当然你可以用@synthesize name = _1name指定实例变量名)

 

什么情况下@property不会auto systhesis?

1、同时重写了getter和setter

2、重写了只读属性的getter

3、使用了dynamic(这个属性就是禁止自动合成)

4、在protocol中定义的所有属性,同category

 

@synthesize合成实例变量的规则是什么?

  1. 如果指定了成员变量的名称,会生成一个指定的名称的成员变量,

  2. 如果这个成员已经存在了就不再生成了.

  3. 如果是 @synthesize foo; 还会生成一个名称为foo的成员变量,也就是说:

如果没有指定成员变量的名称会自动生成一个属性同名的成员变量,

    4. 如果是 @synthesize foo = _foo; 就不会生成成员变量了.

假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?

    不会

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值