面试题
技术
基础
-
为什么说Objective-C是一门动态的语言?
Objective-C 运行时机制是在运行的时候才决定一个对象的类型,消息机制是在运行的时候通过发送消息来调用函数,也正因为运行时机制把编译时的工作转到运行时实现OC的动态特性。
-
讲一下MVC和MVVM,MVP?
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,Model 呈现数据,View 呈现用户界面,而 View Controller 调节它两者之间的交互。
- 视图(View):构建UI的类;例如:按钮,标签,进度条等。
- 模型(Model):视图类所需要的数据;例如:表格需要显示的文字。
- 控制器(Controller):连接视图类和模型类,任务是使数据显示在屏幕上。
MVVM全名是Model View View-Model,ViewModel将表示逻辑从 Controller 移出放到一个新的对象里,即 View Model。就是那些将 Model 数据转换为 View 可以呈现的东西的事情,例如将一个 NSDate 转换为一个格式化过的 NSString。
MVP全名是Model-view-presenter,是使用者界面设计模式的一种。
- Model 定义使用者界面所需要被显示的数据模型,一个模型包含着相关的业务逻辑。
- View 视图为呈现使用者界面的终端,用以表现来自 Model 的数据,和使用者命令路由再经过 Presenter 对事件处理后的数据。
- Presenter 包含着元件的事件处理,负责检索 Model 取得数据,和将取得的数据经过格式转换与 View 进行沟通。
- MVP 设计模式通常会再加上 Controller 做为整体应用程序的后端程序工作。
- 为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?
-
属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesize关键字是用来做什么的?
@property 的本质是:
@property = ivar + getter + setter;
包括哪几个部分:
iavr ; getter ; setter;``(实例变量 + 存取方法)
属性默认的关键字都有哪些
atomic
readwrite
assign
-
@dynamic关键字和@synthesize关键字是用来做什么的?
- 1)@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么默认的就是@syntheszie var = _var;
- @synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。
- @dynamic告诉编译器:属性的setter与getter方法由用户自己实现,不自动生成。
-
属性的默认关键字是什么?
atomic
readwrite
assign
-
*NSString为什么要用copy关键字,如果用strong会有什么问题?(注意:这里没有说用strong就一定不行。使用copy和strong是看情况而定的) *
- 因为NString,NSArray,NSDictionary都有自己对应的子类:NSMutableString,NSMutableArray,NSMutableDictionary,而父类指针可以指向子类对象,使用copy可以让本对象不受外界(子对象)影响,无论给我传入的是一个可变对象还是一个不可变对象,都能保证自身持有的是一个不可变副本。
- 使用strong时,如果这个属性指向一个可变对象,修改可变对象时,这个属性值也会被修改。
- 引用借鉴:http://www.jianshu.com/p/1e1a6f9c26f8
- 如何令自己所写的对象具有拷贝功能?
若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议。如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopying 与 NSMutableCopying 协议。
具体步骤:
需声明该类遵从 NSCopying 协议
实现 NSCopying 协议。该协议只有一个方法:
- (id)copyWithZone:(NSZone *)zone;
注意:一提到让自己的类用 copy 修饰符,我们总是想覆写copy方法,其实真正需要实现的却是 “copyWithZone” 方法。
-
可变集合类 和 不可变集合类的 copy 和 mutablecopy有什么区别?如果是集合是内容复制的话,集合里面的元素也是内容复制么?
- [immutableObject copy]是浅拷贝
- [immutableObject mutableCopy]是深拷贝
- [mutableObject copy]是深拷贝
- [mutableObject mutableCopy]是深拷贝
集合对象的深拷贝只是对象本身,而集合对象的元素还是地址的拷贝,即单层深拷贝
-
为什么IBOutlet修饰的UIView也适用weak关键字?
通过加载xib得到的用户界面,在加载时就已经是view hierarchy(视图层次)的一部分了,后者中的指向都是strong的,因此IBOut指向的对象不该再被hold一次,从而不需要在viewDidUnload方法里再将IBOut指向的对象置为nil.
-
nonatomic和atomic的区别?atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?
atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作。atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么就是说,系统会自动的创建lock锁,锁定变量。nonatomic禁止多线程,变量保护,提高性能。
* atomic:默认是有该属性的,这个属性是为了保证程序在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。
* nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。
* 不过atomic可并不能保证线程安全,atomic只是对setter和getter方法加锁;要想实现真正的线程安全,需要对对象进行加锁,读取操作结束的时候再开放给其他线程访问。
-
UICollectionView自定义layout如何实现?
自定义UICollectionViewLayout重写以下方法:
- (void)prepareLayout 准备方法被自动调用,以保证layout实例的正确。 - (CGSize)collectionViewContentSize 返回collectionView的内容的尺寸 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 1.返回rect中的所有的元素的布局属性 2.返回的是包含UICollectionViewLayoutAttributes的NSArray 3.UICollectionViewLayoutAttributes可以是cell,追加视图或装饰视图的信息, 通过不同的UICollectionViewLayoutAttributes初始化方法可以得到不同类型的UICollectionViewLayoutAttributes: 1)layoutAttributesForCellWithIndexPath: 2)layoutAttributesForSupplementaryViewOfKind:withIndexPath: 3)layoutAttributesForDecorationViewOfKind:withIndexPath: - (UICollectionViewLayoutAttributes )layoutAttributesForItemAtIndexPath:(NSIndexPath )indexPath 返回对应于indexPath的位置的cell的布局属性 - (UICollectionViewLayoutAttributes )layoutAttributesForSupplementaryViewOfKind: (NSString )kind atIndexPath:(NSIndexPath *)indexPath 返回对应于indexPath的位置的追加视图的布局属性,如果没有追加视图可不重载 - (UICollectionViewLayoutAttributes * )layoutAttributesForDecorationViewOfKind: (NSString)decorationViewKind atIndexPath:(NSIndexPath )indexPath 返回对应于indexPath的位置的装饰视图的布局属性,如果没有装饰视图可不重载 - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds 当边界发生改变时,是否应该刷新布局。如果YES则在边界变化(一般是scroll到其他地方)时,将重新计算 需要的布局信息。
3241
32424
34dsfsd