iOS面试属性@property看我就够了!!!

本文详细探讨了Objective-C中的@property特性,包括ivar、getter、setter的生成,@protocol和category中的使用,以及ARC下的默认属性关键字。还讨论了atomic与nonatomic的区别,copy关键字的应用,以及如何处理NSString、NSArray等对象。此外,还涵盖了readwrite、readonly、assign、retain、copy、nonatomic等属性关键字的作用,以及何时使用weak关键字。最后,文章提到了浅拷贝与深拷贝的区别,以及系统对象的copy与mutableCopy方法。
摘要由CSDN通过智能技术生成

property属性的本质

@property() = ivar + getter + setter;

“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。使用@property 系统会自动生成setter和getter方法;

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

完成属性定义后,编译器会自动编写访问这些属性所需的方法,此过程叫做“自动合成”(@synthesize)。除了生成方法代码 getter、setter 之外,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字

@protocol 和 category 中如何使用 @property

在 protocol 中使用 property 只会生成 setter 和 getter 方法声明并没有实现的方法,我们使用属性的目的,是希望遵守我协议的对象能实现该属性category 使用 @property 也是只会生成 setter 和 getter 方法的声明,如果我们真的需要给 category 增加属性的实现,需要借助于运行时的两个函数:

 - objc_setAssociatedObject() 
 - objc_getAssociatedObject()

ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?

对应基本数据类型默认关键字是

  • atomic
  • readwrite
  • assign

对于普通的 Objective-C 对象

  • atomic
  • readwrite
  • strong

@property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?

属性可以拥有的特质分为四类:

  • 原子性 nonatomic 、atomic
  • 读/写权限 readwrite(读写)、readonly (只读)
  • 内存管理语义 assign、strong、 weak、unsafe_unretained、copy
  • 方法名 getter= 、setter=
  • 不常用的 nonnull、null_resettable、nullable

atomic noatomic区别

  • 系统自动生成的 getter/setter 方法不一样。如果你自己写 getter/setter,那 atomic/nonatomic/retain/assign/copy 这些关键字只起提示作用,写不写都一样。
  • 对于atomic的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。比如,线程 A 的 getter 方法运行到一半,线程 B 调用了 setter:那么线程 A 的 getter 还是能得到一个完好无损的对象。
  • nonatomic的速度要比atomic快

atomic能保证线程安全吗?

  • atomic可并不能保证线程安全。如果线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,3种都有可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性的值,可能是 B set 的值,也有可能是 C set 的值。

atomic底层实现

//implementation
@synthesize icode = _icode;

//set
-(void)setIcode:(UIImage *)icode
{
    //同步代码块
    @synchronized (self) {
        
        if(_icode != icode)
        {
            [_icode release];
            _icode = [icode retain];
        }
    }
}
//get
-(UIImage *)icode
{
    UIImage *image = nil;
    //同步代码块
    @synchronized (self) {
        
        image = [[_icode retain] autorelease];
    }
    return image;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值