iOS面试iOS面试须知(BAT)iOS面试题

最全梳理,iOS面试必看!!!

2017-02-14  本文已影响129人  陪你看日出去

序言

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

OC的理解与特性

简述内存管理基本原则

其他注意事项

如何理解MVC设计模式

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

如何理解MVVM设计模式

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

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

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

简述类目category优点和缺点

优点:

缺点:

类别的作用

+ (NSIndexPath *)indexPathForRow:(NSInteger)row
inSection:(NSInteger)section;
     原本属于NSIndexPath的方法,但因为这个方法经常使用的表的时候调用、跟表的关系特别密切,因此把这个方法一类别的形式、声明在UITableView.h中。

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

循环引用示例图

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


多个对象引用示例图

解决方法:

事先知道存在循环引用的地方,在合理的位置主动断开一个引用,是对象回收;
使用弱引用的方法。

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

键路径
键值编码KVC
键值观察KVO
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的区别

Objective-C中可修改和不可以修改类型

当我们调用一个静态方法时,需要对对象进行 **release **吗?

当我们释放我们的对象时,为什么需要调用[super dealloc]方法,它的位置又是如何的呢?

对谓词的认识

static、self、super关键字的作用

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

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

解释 **id **类型

任意类型对象,程序运行时才决定对象的类型。

**switch **语句 **if **语句区别与联系

均表示条件的判断,switch语句表达式只能处理的是整型、字符型和枚举类型,而选择流程语句则没有这样的限制。但switch语句比选择流程控制语句效率更高。

isMemberOfClass 和 isKindOfClass 联系与区别

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

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

CoreData的介绍:
CoreData的特征:

Core Data的6成员对象

Core Data的功能

对象可以被copy的条件

- (id)copyWithZone:(NSZone *)zone { MyObject *copy = [[[self class] allocWithZone: zone] init]; copy.username = [self.username copyWithZone:zone]; return copy;}

自动释放池工作原理

在某个方法中 self.name = _name,name = _name 它 们有区别吗,为什么?

解释self = [super init]方法

定义属性时,什么时候用 assignretain、**copy **以及它们的之间的区别

堆和栈的区别

怎样使用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种方法解决:

线程与进程的区别和联系?

多线程编程

多线程编程是防止主线程堵塞、增加运行效率的最佳方法。

定时器与线程的区别;

Apple设备尺寸和编程尺寸

iPhone设备

IPod设备

iPad设备

TCP和UDP的区别于联系

TCP连接的三次握手

Scoket连接和HTTP连接的区别:

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

GET和POST的区别:

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

ASIHttpRequest、AFNetWorking之间的区别

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

如何进行真机调试

APP发布的上架流程

SVN的使用

如何进行网络消息推送

网络七层协议

对NSUserDefaults的理解

SDWebImage原理

调用类别的方法:

OC中是否有二维数组,如何实现二维数组

LayoutSubViews在什么时候被调用?

深拷贝和浅拷贝

示例图1

示例图2

单例模式理解与使用

对沙盒的理解

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

对瀑布流的理解

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

关键字volatile有什么含意?并给出三个不同的例子:

@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;

自定义实现UITabbarController的原理

iOS中的响应者链的工作原理

View和View之间传值方式

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)

队列和多线程的使用原理

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

内存的使用和优化的注意事项

UIViewController的完整生命周期

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

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;
}
上一篇 下一篇

猜你喜欢

热点阅读