iOS 面试iOS面试学无止境

[转]iOS面试常见问题最全梳理章

2016-08-21  本文已影响260人  ZMJun

转自 iOS 面试常见问题最全梳理

序言

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

OC的理解与特性

简述内存管理基本原则

其他注意事项

@property(getter=theString) NSString * newString;

如何理解MVC设计模式

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

如何理解MVVM设计模式

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

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

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

简述类目category优点和缺点

优点:
缺点:

类别的作用

 + (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section

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

解决方法:

键路径(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 语句区别与联系

isMemberOfClass 和 isKindOfClass 联系与区别

ClassA *a = [ClassA alloc] init];
[a isKindOfClass:[NSObject class]] 

可以检查出 a 是否是 NSObject派生类 的成员,但 isMemberOfClass 做不到。

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

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

CoreData

介绍:
特征:
6成员对象
功能

对象可以被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]方法

定义属性时,什么时候用 assign、retain、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加密。</requestline>

ASIHttpRequest、AFNetWorking之间的区别

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

如何进行真机调试

APP发布的上架流程

SVN的使用

如何进行网络消息推送

网络七层协议

对NSUserDefaults的理解

SDWebImage原理

调用类别的方法:

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

有 array[array[]]

LayoutSubViews在什么时候被调用?

深拷贝和浅拷贝

单例模式理解与使用

对沙盒的理解

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

对瀑布流的理解

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中队列分为以下几种:

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();

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

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;

给UIImage添加生成圆角图片的扩展API:这是on-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;
}
上一篇 下一篇

猜你喜欢

热点阅读