iOS学习iOSiOS 面试

iOS开发面试最全梳理,弄懂你就被录取了

2016-09-28  本文已影响1393人  有梦想的老伯伯

序言

目前形势,参加到iOS队伍的人是越来越多,甚至已经供过于求了。今年,找过工作的人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车的向用人单位输送iOS开发人员,打破了生态圈的动态平衡。以我以往的经验及在公司原有的技术,为iOS应聘者梳理一下面试题,希望能祝一臂之力!

一、OC的理解与特性

1.动态类型
2.动态绑定

基于动态类型,在某个实例对象被确定之后,其类型便被确定了,该对象对应属性和响应消息也被完全确定。

3.动态加载

根据需求加载所需要的资源,最基本就是不同机型的适配,例如,在retina设备上加载@2x的图片,而在老一些的普通苹果设备上加载原图,让程序在运行时添加代码模块以及其他资源,用户可根据需要加载一些可执行代码和资源,而不是在启动时就加载所有组件,可执行代码可以含有和程序运行时整合的新类。

二、简述内存管理基本原则

自动释放池工作原理
Objective-C中可修改和不可以修改类型
当我们调用一个静态方法时,需要对对象进行 **release **吗?
当我们释放我们的对象时,为什么需要调用[super dealloc]方法,它的位置又是如何的呢?
static、self、super关键字的作用
解释self = [super init]方法
在某个方法中 self.name = _name,name = _name 它 们有区别吗,为什么?
对象可以被copy的条件
- (id)copyWithZone:(NSZone *)zone { 
    MyObject *copy = [[[self class] allocWithZone: zone] init]; 
    copy.username = [self.username copyWithZone:zone]; 
    return copy;
}
定义属性时,什么时候用 assignretain、**copy **以及它们的之间的区别
堆和栈的区别
内存的使用和优化的注意事项
其他注意事项

三、如何理解MVC设计模式

MVC是一种架构模式,M表示Model,V表示视图View,C表示控制器Controller:

四、如何理解MVVM设计模式

五、**Objective-C **中是否支持垃圾回收机制?

六、协议的基本概念和协议中方法默认为什么类型

OC中的协议是一个方法列表,且多少有点相关。它的特点是可以被任何类使用(实现),但它并不是类(这里我们需要注意),自身不会实现这样方法, 而是又其他人来实现协议经常用来实现委托对象(委托设计模式)。如果一个类采用了一个协议,那么它必须实现协议中必须需要实现的方法,在协议中的方法默认是必须实现(@required),添加关键字@optional,表明一旦采用该协议,这些“可选”的方法是可以选择不实现的。

七、简述类目 category 优点和缺点

优点:

八、类别的作用

+ (NSIndexPath *)indexPathForRow:(NSInteger)rowinSection:
(NSInteger)section

原本属于NSIndexPath的方法,但因为这个方法经常使用的表的时候调用,跟表的关系特别密切,因此把这个方法一类别的形式,声明在UITableView.中。

九、循环引用的产生原因,以及解决方法

循环引用示例图

多个对象间依然会存在循环引用问题,形成一个环,在编程中,形成的环越大越不容易察觉,如下图所示:

多个对象引用示意图
解决方法

十、键路径(keyPath)、键值编码(KVC)、键值观察(KVO)

键路径
键值编码 KVC
Demo

比如我自定义的一个button

[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];
 #pragma mark KVO 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"highlighted"] ) { 
        [self setNeedsDisplay]; 
    } 
}

对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。

KVC机制通过key找到value的原理
在 **Objective-C **中如何实现 KVO
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath 
options:(NSKeyValueObservingOptions)options 
context:(void *)context;
- (void)observeValueForKeyPath:(NSString *)keyPath 
ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;

十一、代理的作用

十二、NSNotification、Block、Delegate 和 KVO 的区别

十三、 对谓词的认识

十四、#include与#import的区别、**#import **与@class 的区别

十五、@public、@protected、@private 它们的含义与作用

十六、isMemberOfClass 和 isKindOfClass 联系与区别

十七、**iOS **开发中数据持久性有哪几种?

数据存储的核心都是写文件。

CoreData的介绍:
CoreData的特征:
Core Data的6成员对象
Core Data的功能

十八、怎样使用performSelector传入3个以上参数,其中一个为结构体

- (id)performSelector:(SEL)aSelector; 
- (id)performSelector:(SEL)aSelector withObject:(id)object; 
- (id)performSelector:(SEL)aSelector withObject: (id)object1 withObject:(id)object2;
typedef struct HYBStruct {
int a;
int b;
} *my_struct;

@interface HYBObject : NSObject
@property (nonatomic, assign) my_struct arg3;
@property (nonatomic, copy) NSString *arg1;
@property (nonatomic, copy) NSString *arg2;

@end
@implementation HYBObject
// 在堆上分配的内存,我们要手动释放掉
- (void)dealloc {
    free(self.arg3);
}

@end
my_struct str = (my_struct)(malloc(sizeof(my_struct)));
str->a = 1;
str->b = 2;
HYBObject *obj = [[HYBObject alloc] init];
obj.arg1 = @"arg1";
obj.arg2 = @"arg2";
obj.arg3 = str; 
[self performSelector:@selector(call:) withObject:obj];
 // 在回调时得到正确的数据的
- (void)call:(HYBObject *)obj { 
    NSLog(@"%d %d", obj.arg3->a, obj.arg3->b);
}

十九、UITableViewCell上有个UILabel,显示NSTimer实现的秒表时间,手指滚动cell过程中,label是否刷新,为什么?

这是否刷新取决于timer加入到Run Loop中的Mode是什么。Mode主要是用来指定事件在运行循环中的优先级的,分为:

二十、对于单元格重用的理解

解决cell重用的问题
UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:defineString]
修改为:UITableViewCell *cell = [tableview cellForRowAtIndexPath:indexPath];

这样就解决掉cell重用机制导致的问题。

二十一、有a、b、c、d 4个异步请求,如何判断a、b、c、d都完成执行?如果需要a、b、c、d顺序执行,该如何实现?

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*任务a */ });
dispatch_group_async(group, queue, ^{ /*任务b */ });
dispatch_group_async(group, queue, ^{ /*任务c */ }); 
dispatch_group_async(group, queue, ^{ /*任务d */ }); 
dispatch_group_notify(group,dispatch_get_main_queue(), ^{ 
// 在a、b、c、d异步执行完成后,会回调这里
});

二十二、使用block有什么好处?使用NSTimer写出一个使用block显示(在UILabel上)秒表的代码

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                                                 repeats:YES 
                                                callback:^() { 
    weakSelf.secondsLabel.text = ...
}
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

二十三、一个view已经初始化完毕,view上面添加了n个button,除用view的tag之外,还可以采用什么办法来找到自己想要的button来修改button的值

有2种方法解决:

二十四、线程与进程的区别和联系?

多线程编程
多线程编程是防止主线程堵塞、增加运行效率的最佳方法。
定时器与线程的区别;
队列和多线程的使用原理

在iOS中队列分为以下几种:

dispatch_queue_t q = dispatch_queue_create("...", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t q = dispatch_queue_create("......",DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t q = dispatch_get_main_queue();

二十五、TCP和UDP的区别于联系

TCP连接的三次握手

二十六、Scoket连接和HTTP连接的区别:

HTTP协议的特点,关于HTTP请求GET和POST的区别

GET和POST的区别:

GET提交、请求的数据会附在URL之后,即把数据放置在HTTP协议头<requestline>中。
 以"?"分割URL和传输数据,多个参数用&连接。如果数据是英文字母或数字,原样发送, 
如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。
传输数据的大小:
安全性:

二十七、ASIHttpRequest、AFNetWorking之间的区别

二十八、XML数据解析方式各有什么不同,JSON解析有哪些框架?

二十九、SVN的使用

三十、如何进行网络消息推送

三十一、UIViewController的完整生命周期

-[ViewController initWithNibName:bundle:];
-[ViewController init];
-[ViewController loadView];
-[ViewController viewDidLoad];
-[ViewController viewWillAppear:];
-[ViewController viewDidAppear:];
-[ViewController viewWillDisappear:];
-[ViewController viewDidDisappear:];

三十二、深拷贝和浅拷贝

示例图1 示例图2

三十三、对沙盒的理解

每个iOS应用都被限制在“沙盒”中,沙盒相当于一个加了仅主人可见权限的文件夹,及时在应用程序安装过程中,系统为每个单独的应用程序生成它的主目录和一些关键的子目录。苹果对沙盒有几条限制:

1. 应用程序在自己的沙盒中运作,但是不能访问任何其他应用程序的沙盒;
2. 应用之间不能共享数据,沙盒里的文件不能被复制到其他 应用程序的文件夹中,也不能把其他应用文件夹复制到沙盒中;
3. 苹果禁止任何读写沙盒以外的文件,禁止应用程序将内容写到沙盒以外的文件夹中;
4. 沙盒目录里有三个文件夹:Documents——存储应用程序的数据文件,
   存储用户数据或其他定期备份的信息;Library下有两个文件夹,Caches存储应用程序再次启动所需的信息,
   Preferences包含应用程序的偏好设置文件,不可在这更改偏好设置;
   temp存放临时文件即应用程序再次启动不需要的文件。

三十四、ViewController 的 loadView,、viewDidLoad,、viewDidUnload 分别是在什么时候调用的?

三十四、@synthesize、@dynamic的理解

三十五、frame和bounds有什么不同?

三十六、view的touch事件有哪些?

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

三十七、property属性的修饰符的作用

三十八、对于Run Loop的理解

三十九、SQLite中常用的SQL语句

四十、XIB与Storyboards的优缺点

优点:

缺点:

四十一、将字符串“2015-04-10”格式化日期转为NSDate类型

NSString *timeStr = @"2015-04-10";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
formatter.timeZone = [NSTimeZone defaultTimeZone];
NSDate *date = [formatter dateFromString:timeStr];
// 2015-04-09 16:00:00 +0000
NSLog(@"%@", date);

四十二、UIImageView添加圆角

imgView.layer.cornerRadius = 10;
// 这一行代码是很消耗性能的
imgView.clipsToBounds = YES;

这是离屏渲染(off-screen-rendering),消耗性能的

- (UIImage *)imageWithCornerRadius:(CGFloat)radius {
    CGRect rect = (CGRect){0.f, 0.f, self.size};

    UIGraphicsBeginImageContextWithOptions(self.size, NO, UIScreen.mainScreen.scale);
    CGContextAddPath(UIGraphicsGetCurrentContext(), 
    [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
    CGContextClip(UIGraphicsGetCurrentContext());

    [self drawInRect:rect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;
}

感谢您的阅读,本文转载自Jack_liniOS,面试必看,最全梳理
如有侵权,请联系本人。

上一篇 下一篇

猜你喜欢

热点阅读