2019-01-12

iOS面试题及答案

#import跟 #include 有什么区别,@class呢,#import<> 跟 #import””有什么区别?

1).#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入。

2).@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含。3).#import<>用来包含系统的头文件,#import””用来包含用户头文件。


什么情况使用 weak 关键字,相比 assign 有什么不同?

1.在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如: delegate 代理属性。

2.自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用weak,自定义IBOutlet控件属性一般也使用weak;当然,也可以使用strong。IBOutlet连出来的视图属性为什么可以被设置成weak? 因为父控件的subViews数组已经对它有一个强引用。

不同点:assign可以用基本数据类型 和 OC对象,而weak必须用于 OC对象。weak表明该属性定义了一种“非拥有关系”。在属性所指的对象销毁时,属性值会自动清空(nil)。

1) 都不是强指针(不是强引用),不能保住对象的命

2) weak生成的成员变量是用__weak修饰的 : 所指向的对象销毁后,会自动变成nil指针(空指针),不再指向已经销毁的对象

3) assign生成的成员变量是用__unsafe_unretained修饰的 : 所指向的对象销毁后,仍旧指向已经销毁的对象


用@property声明的 NSString / NSArray / NSDictionary 经常使用 copy 关键字,为什么?如果改用strong关键字,可能造成什么问题?

用@property声明NSString、NSArray、NSDictionary经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作(就是把可变的赋值给不可变的),为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

1.因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本。

2.如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。

//总结:使用copy的目的是,防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发送变化会无意间篡改不可变类型对象原来的值。

浅拷贝:只复制指向对象的指针,而不复制引用对象本身。

深拷贝:复制引用对象本身。内存中存在了两份独立对象本身,当修改A时,A_copy不变。

【总结一句话】: 只有对不可变对象进行copy操作是指针复制(浅复制),其它情况都是内容复制(深复制)!


@synthesize 和 @dynamic 分别有什么作用?

@property有两个对应的词,一个是@synthesize(合成实例变量),一个是@dynamic。如果@synthesize和@dynamic都没有写,那么默认的就是@synthesizevar = _var;// 在类的实现代码里通过 @synthesize 语法可以来指定实例变量的名字。(@synthesize var = _newVar;)

1.@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。2.@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成(如,@dynamicvar)。


类别的作用?继承和类别在实现中有何区别?

category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改,并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。

类别主要有3个作用:

1).将类的实现分散到多个不同文件或多个不同框架中。

2).创建对私有方法的前向引用。

3).向对象添加非正式协议。

继承可以增加,修改或者删除方法,并且可以增加属性。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,144评论 1 32
  • 面试题参考1 : 面试题[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios阅读 1,758评论 0 4
  • pd践行一个月了,时间好快,现在终于也出现了新的比较大的挑战。孩子最近三天开始大声赖几,来表达他的不满,意愿没有被...
    胖猫儿啊胖猫阅读 220评论 0 0
  • 1.我必须要先感谢我热情可爱的宝宝,晚上洗完澡,从浴室出来,她爸爸抱着她在房间门口等我,她看见我出来,开心的手舞足...
    倾斜5度阅读 208评论 0 1
  • 原来那不是骗人的。看到绝美的风景,真的会感动。 说笑了一整天,忙碌了一整天,洗漱之后背上自己的小包准备去前院陪...
    熙熙哈阅读 957评论 0 2