您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > IOS面试题_含答案
1.什么情况使用weak关键字,相比assign有什么不同?什么情况使用weak关键字?1)在ARC中,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如:delegate代理属性2)自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用weak,自定义IBOutlet控件属性一般也使用weak;当然,也可以使用strong。在下文也有论述:《IBOutlet连出来的视图属性为什么可以被设置成weak?》不同点:1)weak此特质表明该属性定义了一种“非拥有关系”(nonowningrelationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似,然而在属性所指的对象遭到摧毁时,属性值也会清空(nilout)。而assign的“设置方法”只会执行针对“纯量类型”(scalartype,例如CGFloat或NSlnteger等)的简单赋值操作。2)assigin可以用非OC对象,而weak必须用于OC对象2.这个写法会出什么问题:@property(copy)NSMutableArray*array;两个问题:1、添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃.因为copy就是复制一个不可变NSArray的对象;2、使用了atomic属性会严重影响性能。第1条的相关原因在下文中有论述《用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?》以及上文《怎么用copy关键字?》也有论述。第2条原因,如下:该属性使用了同步锁,会在创建时生成一些额外的代码用于帮助编写多线程程序,这会带来性能问题,通过声明nonatomic可以节省这些虽然很小但是不必要额外开销。在默认情况下,由编译器所合成的方法会通过锁定机制确保其原子性(atomicity)。如果属性具备nonatomic特质,则不使用同步锁。请注意,尽管没有名为“atomic”的特质(如果某属性不具备nonatomic特质,那它就是“原子的”(atomic))。在iOS开发中,几乎所有属性都声明为nonatomic。一般情况下并不要求属性必须是“原子的”,因为这并不能保证“线程安全”(threadsafety),若要实现“线程安全”的操作,还需采用更为深层的锁定机制才行。例如,一个线程在连续多次读取某属性值的过程中有别的线程在同时改写该值,那么即便将属性声明为atomic,也还是会读到不同的属性值。因此,开发iOS程序时一般都会使用nonatomic属性。但是在开发MacOSX程序时,使用atomic属性通常都不会有性能瓶颈。3.@property中有哪些属性关键字?/@property后面可以有哪些修饰符?属性可以拥有的特质分为四类:原子性---nonatomic特质在默认情况下,由编译器合成的方法会通过锁定机制确保其原子性(atomicity)。如果属性具备nonatomic特质,则不使用同步锁。请注意,尽管没有名为“atomic”的特质(如果某属性不具备nonatomic特质,那它就是“原子的”(atomic)),但是仍然可以在属性特质中写明这一点,编译器不会报错。若是自己定义存取方法,那么就应该遵从与属性特质相符的原子性。读/写权限---readwrite(读写)、readooly(只读)内存管理语义---assign、strong、weak、unsafe_unretained、copy方法名---getter=、setter=getter=的样式:1@property(nonatomic,getter=isOn)BOOLon;(setter=这种不常用,也不推荐使用。故不在这里给出写法。)不常用的:nonnull,null_resettable,nullable4.weak属性需要在dealloc中置nil么?为什么?不需要。在ARC环境无论是强指针还是弱指针都无需在deallco设置为nil,ARC会自动帮我们处理。5.一个objc对象的isa的指针指向什么?有什么作用?指向他的类对象,从而可以找到对象上的方法6.下面的代码输出什么?都输出Son7.runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)每一个类对象中都一个方法列表,方法列表中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现.8.objc使用什么机制管理对象内存?通过retainCount的机制来决定对象是否需要释放。每次runloop的时候,都会检查对象的retainCount,如果retainCount为0,说明该对象没有地方需要继续使用了,可以释放掉了。9.ARC通过什么方式帮助开发者管理内存?编译时根据代码上下文,插入retain/release10.BAD_ACCESS在什么情况下出现?访问了野指针,比如对一个已经释放的对象执行了release、访问已经释放对象的成员变量或者发消息。死循环11.苹果是如何实现autoreleasepool的?autoreleasepool以一个队列数组的形式实现,主要通过下列三个函数完成.objc_autoreleasepoolPushobjc_autoreleasepoolPopobjc_aurorelease看函数名就可以知道,对autorelease分别执行push,和pop操作。销毁对象时执行release操作。12.使用block时什么情况会发生引用循环,如何解决?一个对象中强引用了block,在block中又使用了该对象,就会发射循环引用。解决方法是将该对象使用__weak或者__block修饰符修饰之后再在block中使用。idweakweakSelf=self;或者weak__typeof(&*self)weakSelf=self该方法可以设置宏id__blockweakSelf=self;13.GCD的队列(dispatch_queue_t)分哪两种类型?串行队列SerialDispatchQueue并行队列ConcurrentDispatchQueue14.以下代码运行结果如何?只输出:1。发生主线程锁死。15.KVC的keyPath中的集合运算符如何使用必须用在集合对象上或普通对象的集合属性上简单集合运算符有@avg,@count,@max,@min,@sum,格式@@sum.age或@集合属性.@max.age
本文标题:IOS面试题_含答案
链接地址:https://www.777doc.com/doc-4845106 .html