iOS面试题

1. SDWebImage的实现原理:

SDWebImage是用来加载网络图片的第三方库,实现了异步请求数据,并且实现了图片的缓存
实现原理如下:
在内存和沙盒目录下各缓存一份文件,内存中的文件到一定程度会自动清除,沙盒目录下的文件需要由用户手动清除,首先检测内存-检测沙盒目录-网络请求。

2. AppDelegate的生命周期

  1. 程序启动成功之后会自动调用这个方法
    这个方法是iOS程序真正的入口,iOS编程实质就是在实现这个方法
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // 搭建UI界面,请求数据,展示数据
    print("Lauch succeed")
    return true
    }

  2. 应用程序将要变成非活跃状态
    应用程序不显示在手机屏幕上的时候就是非活跃状态
    按home键让程序在后台运行、来电、跳转,可以将程序变成非活跃状态
    func applicationWillResignActive(application: UIApplication) {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    //一般在这个方法中关闭定时器、暂停音频、视频和游戏等
    print("将要变成非活跃状态")
    }

  3. 应用程序已经进入后台的时候会调用这个方法
    在应用程序打开的时候按home键才会进入后台
    func applicationDidEnterBackground(application: UIApplication) {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    print("已经进入后台")
    }
    

4.应用程序将要进入前台
从后台打开应用程序的才算
func applicationWillEnterForeground(application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.

      //根据情况开启定时器、继续播放
      print("将要进入前台")
    }

5.应用程序已经变成活跃状态的时候调用此
从后台回到前台、如电话打完了就会从非活跃进入活跃状态
func applicationDidBecomeActive(application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
print("已经变成活跃状态")
}
6.应用程序将要终止的时候会调用这个方法
一般情况下,只有从后台强制将应用程序退出的时候,程序才会终止
func applicationWillTerminate(application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
//Application does not run in backgroud
//让应用程序不能后台运行:在info.plist文件中添加key为“Application does not run in backgroud”,值为yes
print("程序将要终止")
}
7.应用程序接受到内存警告的时候回自动调用这个方法
func applicationDidReceiveMemoryWarning(application: UIApplication) {
//销毁一些不必要的内存,一般在这儿释放一些缓存
print("接受到内存警告")

        }
     }

3. 视图控制器的生命周期

说明:

  1. 视图控制器的生命周期指的是视图控制器中view的属性

  2. 视图控制器所有声明周期相关方法在重写的时候必须通过super去调用父类当前的生命周期方法 3.生命周期的方法都是自动调用的

    override func loadView() {
    super.loadView()
    print("view属性诞生")
    }
    

    在视图控制器view属性加载完成后会调用这个方法(将创建好的UIView对象赋给视图控制器对象,作为视图控制器的view属性)->在这创建界面
    每次创建视图控制器的时候调用一次
    override func viewDidLoad() {
    super.viewDidLoad()
    print("view加载成功")
    // Do any additional setup after loading the view.
    }
    在view将要显示在界面上的时候会调用(可能会被调用多次)
    override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    print("view将要显示出来")
    }
    在View已经显示在界面上的时候会被调用,可能会被调用多次
    override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    print("view已经显示出来")
    }
    在view将要消失的时候会被调用(可能会调用多次)
    override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    print("view将要消失")
    }
    在view已经消失的时候会调用,可能会调用多次
    override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)
    print("view已经消失")
    }

    接收到内存警告会被调用
    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    print("内存警告")
    }
    简单来说,就是UIView的执行顺序就是init —— loadView —— viewDidLoad —— viewWillAppear —— viewWillDisappear —— viewDidUnload —— dealloc.

4. get 和 post 请求的区别

  1. 安全性问题:get请求的参数全部暴露在接口中,一般叫做明文请求或者傻瓜式请求,post请求的参数一般是以字典的方式进行拼接,相对于get比较安全
  2. 对文件大小的要求:get不允许向服务器上传文件(图片,pdf,音视频)
  3. 如果从服务器获取数据或者查询数据使用get请求,如果上传数据到服务器或者修改服务器上数据使用post

5. KVO 和 KVC

目前的理解:
KVC: Key-value-coding 就是设置值和获取值的
KVO: Key-value-Observing 基于KVC,用来检测KVC中值得变化,作出一系列反应的。

6. iOS的设计模式

  1. MVC(Model View Controllers) 即模型-视图-控制器模式
    优点:
    (1)、开发人员可以只关注整个结构中的其中某一层;
    (2)、可以很容易的用新的实现来替换原有层次的实现;
    (3)、可以降低层与层之间的依赖;
    (4)、有利于标准化;
    (5)、利于各层逻辑的复用。
    缺点:
    (1)、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
    (2)、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
  2. 工厂模式
  3. 代理模式
  4. 策略模式
  5. 单例模式
  6. 观察者模式

7.响应者链

当事件发生的时候,响应链首先被发送给第一个响应者(往往是事件发生的视图,也就是用户触摸屏幕的地方)。事件将沿着响应者链一直向下传递,直到被接受并作出处理。一般来说,第一响应这是个视图对象或者其子类,当其被触摸后事件就交由它处理,如果他不处理,时间就会被传递给视图控制器对象UIViewController(如果存在),然后是它的父视图对象(superview),以此类推直到顶层视图。接下来会沿着顶层视图(topview)到窗口 (UIwindow对象)再到程序的(UIApplication对象),如果整个过程都没有响应这个事件,则该事件被丢弃,一般情况下,在响应链中只要有对象处理事件,事件就会被传递典型的响应路线。图如:
First Responser -> The Window ->The Applicationn -> App Delegate

8. 线程和进程是什么,区别

线程是CUP独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段),进程是资源分配的基本单位(进程是一块包含了某些资源的内存区域)。进程是线程的容器,真正完成代码执行的是线程,而进程则作为线程的执行环境。一个程序至少包含一个进程,一个进程至少包含一个线程,一个进程中的多个线程共享当前进程所拥有的资源。

9.对多线程的理解和iOS中实现多线程的几种方法

26.谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?(UI第二十二讲 多线程编程)
好处:
①、使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载
②、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好
缺点:
①、大量的线程降低代码的可读性,
②、更多的线程需要更多的内存空间
③、当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。
iOS有三种多线程编程的技术:
①、NSThread(两种创建方式)

[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[myThread start];

②、NSOperationQueue

NSOperationQueue *oprationQueue =  [[NSOperationQueue alloc] init];
oprationQueue addOperationWithBlock:^{
//这个block语句块在子线程中执行
}

③、Grand Central Dispatch (GCD)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗时的操作
dispatch_async(dispatch_get_main_queue(), ^{
    // 更新界面
});
});

http://blog.csdn.net/totogo2010/article/details/8016129
PS:不显示的创建线程的方法:
用NSObject的类方法 performSelectorInBackground:withObject:
创建一个线程:

[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

10.线程同步和异步的区别,如何实现?

同步:一个线程要等待上一个线程执行完之后才能执行当前的线程,生活中的例子(上厕所,只有一个坑位)。
异步:同时去做两件或者多件事。比如边听歌边看报。

11.开发者账号有哪几种,区别是什么?

开发者账号的种类:

  1. 个人开发者账号:99$,个人开发者账号只能有一个开发者,通过它开发的应用可以上架到appStore,每个账号限定100台设备,每年续费一次
  2. 公司开发者账号: 99$,公司开发者账号可以允许有多个开发者,在申请开发者账号之前,需要先申请一个邓白氏编码,然后再去申请开发者账号,通过它开发的应用可以上架到appStore, 每个账号的设备同样是100台
  3. 企业开发者账号:299$,企业开发者账号同样允许有多个开发者,在申请开发者账号之前需要先申请一个邓白氏编码,然后再去申请开发者账号,通过它开发的应用不能上架到App Store, 主要是为了内部使用,设备最多可以达到1000台,每年续一次费
  4. 教育: 免费,但是需要上传证书

12.简述你对协议的理解:

a想做一件事却因为一些原因不能做,于是让b遵循a的一些约定,这样b就可以帮助a做事了。协议中包括了遵循方b需要实现的一些方法,以及b能够做的事情。协议代表了约定和能力。

13.如何理解ARC自动引用计数机制

ARC--自动引用计数 可以用来管理对象的使用以及了解对象的使用情况,当对象引用计数不为0时,对象不会被释放,当对象引用计数为0时 dealloc函数被调用 对象将会被释放。

14.如何理解retain/copy/assign/release/autorelease/dealloc关键字:

retain让对象引用计数加1,release让对象引用计数减1,当对象引用计数为0时会调用dealloc 将对象进行释放。copy是你不想让a和b共享一块内存时候,让a和b有各自的内存。在使用基本数据类型的时候需要使用assgin,assgin是直接赋值,会引起对象引用计数加1.

15.self.name = xxx 与 _name = xxx的区别

16.类别和继承有什么区别和联系

类别是对父类进行扩展,继承是将父类中的属性、方法等保留下来,根据自己的实际情况进行实现。

17.请简述你对strong和weak关键字的理解 以及_unsafe_unretained与weak的区别:

strong相当于retain 让对象引用计数加1,防止对象在异常情况下被提前释放,导致crash。weak 弱引用防止产生循环应用无法释放对象和产生野指针。

18.weak和assign的区别

19.如何实现ARC和MRC的混编

在targets的build phases选项下Compile Sources下选择要使用arc编译的文件:  在targets的build phases选项下Compile Sources下选择要不使用arc编译的文件, 就会出报错。方法如下,双击它 输入 -fno-objc-arc 即可。
如果在ARC 工程中 加MRC 加 -fno-objc-arc 如果在MRC 工程中 加 ARC 加 -fobjc-arc

20.Objective-C中变量默认是私有的么?方法默认是私有的么?

在OC里面都是公有的

21.#import"".h 和@class+类名的区别:

import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。

22.请简述页面传值都有哪些实现方法

Block、 委托协议、 通知、 单例、NSUserDefaults

23.简述深拷贝和浅拷贝的区别

深拷贝会重新在堆上开辟一块内存空间 是一个全新的对象 指针地址和原来不一样 浅拷贝不会重新开辟一块内存空间 指针和原来是一样的

24.系统中哪些对象是单例

UIApplication、NSUserDefaults、NSNotificationCenter、NSFileManager、NSUrlSession等

24.简述你对MVC设计模式的理解

主要做模型和视图的分离,Model - View - Controller 模型负责数据任务 试图负责呈现 以及和用于进行交互 控制器用来控制试图,符合低耦合的设计理念。

25.简述对工厂方法的理解

批量生产的方法。。。。(需完善)

26.什么是代理模式,实现代理需要注意什么

代理模式:帮助别人完成别人委托你完成的事情。你需要注意遵守别人给你定的约定,和你是否拥有完成这件事的能力。(需完善)

27.请简述UITableView对CELL的重用机制

首先会创建一屏的cell,每个都有个复用表示符,不用的时候就放到复用池里面,当拖动的时候,去复用池中查找,如果有就拿来用,没有才创建。

28.简述iOS的事件传递机制

UIEvent
iOS封装成UIEvent——>前景App(runLoop事件)——>UIApplication——UIWindow(keyWindow)——> viewController——>view.............hitTestEvent

29.如何理解Block,有什么用途

Block本质是没有名字的匿名函数,主要的作用是进行回调,比如页面间的反向传值。

30.简述TCP和UDP的区别

TCP像打电话,是可靠的,UDP像发短信,是不可靠的。TCP是3次握手,四次挥手,UDP是数据包的形式(1.TCP是基于连接的,UDP是基于无连接 2。对系统资源的要求(TCP较多,UDP少) 3。UDP程序结构较简单 4。流模式与数据报模式 5。TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证)

31.怎样保证定位更省电

1.用的时候才开
2.定位精度越低越省电。。。。(待补充)

32.xml和json数据各有哪些优势

引用http://www.cnblogs.com/SanMaoSpace/p/3139186.html

33.什么是主键,什么是外键

(待补充)

34.iOS如何实现数据模型的存储

归档和解归档

35.请简述iOS的沙盒机制

IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。
1.每个应用程序都在自己的沙盒内
2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容
3.应用程序向外请求或接收数据都需要经过权限认证

36.如何检测项目中的内存泄漏

1.Xcode中的Product中的Analyze是静态检测(但是循环引用检测不出来)
2.Produc中的Profile,出来Instruments中的工具,选择Leaks就可以直观的检测有无内存泄漏。

37.为什么 UIScrollView 的滚动会导致 NSTimer 失效?

定时器里面有个runoop mode,一般定时器是运行在defaultmode上。但是如果滑动了这个页面,主线程runloop会转到UITrackingRunLoopMode中,这时候就不能处理定时器了,造成定时器失效,原因就是runroop mode选错了,解决办法有2个

一个是更改mode为NSRunLoopCommonModes(无论runloop运行在哪个mode,都能运行),
还有种办法是切换到主线程来更新UI界面的刷新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 基础 1. 为什么说Objective-C是一门动态的语言? 2. 讲一下MVC和MVVM,MVP? 3. 为...
    波妞和酱豆子阅读 3,307评论 0 46
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,003评论 0 12
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 1,960评论 0 7
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,345评论 0 35