ios中部分关于分类,扩展,属性,深浅拷贝的一些问题

1.分类都有哪些使用场合? 

(1)可以减少单个类的体积,降低耦合性,同一个类可以多人进行开发
(2)可以为系统类添加分类进行拓展
(3)模拟多继承
(4)把静态库的私有方法公开

2.分类当中都可以添加哪些内容?

        分类中只能添加方法,不能增加属性(因为分类的结构体中没有属性列表),原则上讲他只能添加方法,不能添加属性(成员变量),实际上他是可以通过其他方式来添加属性,比如runtime。但是使用runtime也只能实现setter和getter方法,而没有_成员变量,如果调用_成员变量,程序还是会报错。

3.在分类中添加属性有什么注意点?分类当中要怎么保存一个属性的值?

        分类中只能添加方法,不能增加属性(因为分类的结构体中没有属性列表),原则上讲他只能添加方法,不能添加属性(成员变量)

        分类添加的属性要生成get和set方法,不会自动产生私有变量。需要调用runtime里面的方法,进行关联对象。

  • 方法一:定义静态变量,采用静态变量的地址。
  • 方法二:直接使用get函数的地址

4.什么是扩展?

类扩展(extension)是category的一个特例,有时候也被称为匿名分类。他的作用是为一个类添加一些私有的成员变量和方法。

5.扩展和分类的区别?

1、类别原则上只能添加方法而不能添加属性(能添加属性的原因只是通过runtime解决无setter/getter方法的问题而已,如果调用_成员变量,程序还是会报错)。

2、类扩展不仅可以增加方法,还可以增加实例变量(或者属性),只是该变量默认是@private类型的。(所以作用范围只能在自身类,而不是子类或者其它地方)

3、类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的,这是因为类扩展是在编译阶段被添加到类中,而分类是在运行时添加到类中。

4、类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。

6.OC的属性关键字

7.什么时候会用到weak关键字?

主要是用在避免循环引用上

8.你了解的内存管理关键字具体使用对象

assign:修饰基本数据类型,如 NSInteger、BOOL、int、float 等;

weak:修饰弱引用,主要可以用于避免循环引用

strong:既可以修饰基本数据类型,也可以修饰对象类型

copy:用于 NSString、NSArray、NSDictionary 是为了保证赋值后是一个不可变对象,以免遭外部修改而导致不可预期的结果

9.copy关键字有使用过吗?具体做什么的?

用于 NSString、NSArray、NSDictionary 是为了保证赋值后是一个不可变对象,以免遭外部修改而导致不可预期的结果。

10.你对深浅拷贝理解吗?什么是深拷贝,什么是浅拷贝?

浅拷贝:浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值 是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。

深拷贝:会克隆出一个对象,数据相同,但是引用地址不同(就是拷贝A对象里面的数据,而且拷贝它里面的子对象)

11.你对拷贝是怎样理解的?更具体点的问题:

(1)对NSString做copy是深拷贝还是浅拷贝

浅拷贝

(2)对NSString做一个mutablecopy

深拷贝

(3)对一个mutablearraycopy

深拷贝

(4)对一个mutablearray做Mutablecopy

深拷贝

具体可看下图

12.对自定义对象实现深拷贝操作怎样实现

实现NSCopying协议

13.你知道atomic和nonatomic的区别吗

Atomic 原子性(默认),编译器会自动生成互斥锁(以前是自旋锁,后面改为了互斥锁),对 setter 和 getter 方法进行加锁,可以保证属性的赋值和取值的原子性操作是线程安全的,但不包括操作和访问。

Nonatomic 非原子性,一般属性都用 nonatomic 进行修饰,因为 atomic 耗时。

14.Readwrite和readonly有什么区别?默认使用哪个关键字?

Readwrite:可读可写

Readonly:只读

默认可读可写

15.什么时候会使用到readonly这个属性关键字

为了达到封装的目的,我们应该只在确有必要时才将属性对外暴露,并且尽量把对外暴露的属性设为 readonly(tip:如果这时候想在对象内部通过 setter 修改属性,可以在类扩展中将属性重新声明为 readwrite;如果仅在对象内部通过 _ivar 修改,则不需要重新声明为 readwrite。)

16.copy方法生成的是一个可变对象还是不可变对象

        不可变对象

17.strong关键字修饰的属性有什么特点?

能够持有对象,直接决定对象的存亡

18.强引用和弱引用有什么区别

19.Block什么时候会造成循环应用

比如当一个对象持有block,而该block又持有该对象时,类似下面的伪代码会照成循环引用:

[self block:^{

      self.value=1;

}];

20.循环引用会造成什么后果?

内存泄漏,对象无法被释放

21.怎么去解决循环引用

将其中一个对象用weak修饰

22.category 中有 +load 方法吗?+load 方法是什么时候调用的?+load 方法能继承吗?       

(1)分类中有+load方法;

(2)+load方法在Runtime加载类、分类的时候调用;

(3)load方法可以继承,但是一般情况下不会手动去调用+load方法,都是让系统自动调用。

 23.例如a用strong修饰引用b  b用weak修饰引用a a释放了 b会释放吗

                会被释放

        (1)那如果b对a也是用strong呢

                由于被循环引用了,无法释放

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值