面试题9
1.描述应用程序的启动顺序。
1、程序入口main函数创建UIApplication实例和UIApplication代理实例
2、在UIApplication代理实例中重写启动方法,设置第一ViewController
3、在第一ViewController中添加控件,实现对应的程序界面。
2.为什么很多内置类如UITableViewControl
的delegate
属性都是assign
而不是retain
?请举例说明。
防止循环引用
Student * str = [];
Teacher *teacher = [[Teacher alloc] init];
Student * student = [[Student alloc] init];
teacher.delegate = student;
student.delegate = teacher;
在teacher中dealloc会release当前的Delegate,就会触发student对象release,继而也会导致student执行dealloc,在student中也会release自己的delegate,产生循环了。
3.使用UITableView
时候必须要实现的几种方法?
2个。
//这个方法返回每个分区的行数
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;
//这个方法返回我们调用的每一个单元格
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath)indexPath;
4.写一个便利构造器方法。
+ (id)studentWithName:(NSString *)newName andAge:(int)newAge {
Student *stu = [[Student alloc] initWithName:newName andAge:newAge];
return [stu autorelease];
}
5.UIImage
初始化一张图片有几种方法?简述各自的优缺点。
1、从资源读取 , 这个方法的图片是从缓存里面获取的, 先在缓存里面查看是不是有这个图片, 没有的话将图片添加进缓存再使用. 有的话直接使用缓存里面的. 如果这张图片用的次数比较多的话, 建议使用这种方式. 缺点是效率低下.
UIImage *image = [UIImage imageNamed:@”1.png”];
2 .从手机本地读取, 比较第一种方式, 这个事直接加载图片的. 所以建 议在图片使用率低的图片时 使用这个方法.
//读取本地图片非resource NSString *aPath3 = [NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];
[UIImage imageWithContentsOfFile:aPath3]
6.回答person
的retainCount
值,并解释为什么
Person * per = [[Person alloc] init];
self.person = per;
person属性如果为assign的话retainCount为1,如果为retain的话retainCount为2
7.这段代码有什么问题吗:
@implementation Person
(void)setAge:(int)newAge {
self.age = newAge;
}
@end
死循环
8.这段代码有什么问题,如何修改
for (int i = 0; i < someLargeNumber; i++) {
NSString *string = @”Abc”;
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@“%@”, string);
}
如果数字很大的话会造成内存一直增加(因为一直通过便利构造器方法创建autorelease对象),直到循环结束才减少,在循环内加一个自动释放池,更改后代码如下:
for (int i = 0; i < someLargeNumber; i++) {
NSString *string = @”Abc”;
@autoreleasepool {
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@“%@”, string);
}
}
9.截取字符串”20 | http://www.baidu.com”
中,”|”
字符前面和后面的数据,分别输出它们。
NSString *string = @” 20 | http://www.baidu.com”;
[string componentsSeparatedByString:@”|”];
10.用obj-c
写一个冒泡排序
NSMutableArray *array = [NSMutableArray arrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];
for (int i = 0; i < array.count; i ++) {
for (int j = 0; j < array.count - 1 - i; j++) {
if ([[array objectAtIndex:j] integerValue] > [[array objectAtIndex:j + 1] integerValue]) {
[array exchangeObjectAtIndex:j withObjectAtIndex:j + 1];
}
}
}
NSLog(@"%@", array);
面试题10
1.简述你对UIView
、UIWindow
和CALayer
的理解.
UIView继承于UIResponder, UIResponder继承于NSObject,UIView可以响应用户事件。
CALayer继承于NSObject,所以CALayer不能响应事件。
UIView构建界面, UIView侧重于对内容的管理,CALayer侧重于对内容的绘制。
UIView是用来显示内容的,可以处理用户事件;
CALayer是用来绘制内容的,对内容进行动画处理,依赖与UIView来进行显示,不能处理用户事件。
UIView:属于UIkit.framework框架,负责渲染矩形区域的内容,为矩形区域添加动画,响应区域的触摸事
件,布局和管理一个或多个子视图
UIWindow:属于UIKit.framework框架,是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,
但可以手动创建多个UIWindow,同时加到程序里面。UIWindow在程序中主要起到三个作用:
1、作为容器,包含app所要显示的所有视图
2、传递触摸消息到程序中view和其他对象
3、与UIViewController协同工作,方便完成设备方向旋转的支持
CAlayer:属于QuartzCore.framework,是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。
UIView和CALayer是相互依赖的,UIView依赖CALayer提供内容,CALayer依赖UIView一共容器显示
绘制内容。
2.写一个完整的代理,包括声明,实现.
3.分析json
、xml
的区别?json
、xml
解析方式的底层是如何处理的?
区别:
(1)可读性方面:基本相同,xml的可读性比较好
(2)可扩展性方面:都具有很好的扩展性
(3)编码难度方面:相对而言:JSON的编码比较容易
(4)解码难度:json的解码难度基本为零,xml需要考虑子节点和父节点
(5)数据体积方面:json相对于xml来讲,数据体积小,传递的速度跟快些
(6)数据交互方面:json与JavaScript的交互更加方面,更容易解析处理,更好的数据交互
(7)数据描述方面:xml对数据描述性比较好
(8)传输速度方面:json的速度远远快于xml JSON底层原理:遍历字符串中的字符,最终根据格式规定的特殊字符,比如{}号,[]号, : 号 等进行区分,{}号是一个字典 的开始,[]号是一个数组的开始, : 号是字典的键和值的分水岭,最终乃是将json数据转化为字典,字典中值可能是字典,数 组,或字符串而已。
XML底层原理: XML解析常用的解析方法有两种:DOM解析和SAX解析。DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。 DOM 解析把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。使用 DOM 解析器的时候需 要处理整个 XML 文档,所以对性能和内存的要求比较高。SAX在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag 的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决 定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。
延伸:SAX与DOM的区别:
1、SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且由于应用程序只是 在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不 必解析整个文档;它可以在某个条件得到 满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。另一方面,由 于应用程序没有以任何方式存储数据,使用 SAX 来更改数据或在数据流中往后移是不可能的。
2、DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数 据和结构作出更改。它还可以在任何时候在树中上下 导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单 得多。另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一 棵 DOM 树可能是一个缓慢的过程。
3、选择 DOM 还是选择 SAX,这取决于下面几个因素:应用程序的目的:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使 用 SAX 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。数据容量: 对于大型文件,SAX 是更好的选择。数据将如何使用:如果只有数据中的少量部分会被使用,那么使用 SAX 来将该部分数据提取到应用程序中可能更好。 另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX 也许不是恰当的选择。对速度的需要:SAX 实现通常要比 DOM 实现更快。SAX 和 DOM 不是相互排斥的,记住这点很重要。您可以使用 DOM 来创建 SAX 事件流,也可以使用 SAX 来创建 DOM 树。事实上,用于创建 DOM 树的大多数解析器实际上都使用 SAX 来完成这个任务!
XML是标准通用标记语言 (SGML)的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。JSON(JavaScriptObject Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很 高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl,Python等)体系的行为。这些特性使JSON成为理想的数据交换语言。
4.ViewController
的 didReceiveMemoryWarning
是在什么时候被调用的?默认的操作是什么?
当程序接到内存警告时ViewController
将会收到这个消息:didReceiveMemoryWarning
从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload
中去。
这个函数的默认实现是:
检查controller
是否可以安全地释放它的view
,如果view
可以被释放,那么这个函数释放view
并调用viewDidUnload
。重载这个函数来释放controller
中使用的其他内存。但要记得调用这个函数的super
实现来允许父 类(一般是 UIVIewController)释放view。 如果你的ViewController
保存着view
的子view
的引用,那么,在早期的iOS版本中,你应该在这个函数中来释放这些引用。而在iOS3.0或更高版本中,你应该在viewDidUnload
中释放这些引用。
5.面向对象的三大特征,并作简单的介绍.
面向对象的三个基本特征是:封装、继承、多态。
封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的 数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。隐藏对象的属性和实现细节,仅对外公开接口,提高代 码安全性,封转程度越高,独立性越强,使用越方便。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”
多态性:允许你将父对象设臵成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:父类类型的指针可以指向子类类型的指针
6.重写一个NSStrng
类型的,retain
方式声明name
属性的setter
和getter
方法.
@interface ViewController : UIViewController
{
NSString *_name;
}
- (void)setName:(NSString *)name;
- (void)setName:(NSString *)name {
if (_name != name) {
[name retain];
[_name release];
_name = name;
}
}
7.简述NotificationCenter
、KVC
、KVO
、Delegate
?并说明它们之间的区别?
Notification:观察者模式,观察者模式一般用于一对多, 发出消息者并不在意有没有\有多少个接收者, 只管发出消息. 观察者模式的效率低于代理模式.
KVC键值编码,可以直接通过字符串的名字(key)或者路径来间接访问属性的机制,而不是通过调用getter和setter方法访问。
KVO:观测指定对象的属性,当指定对象属性的setter方法被调用之后会通知相应的观察者。 delegate:一对一,delegate遵循某个协议并实现协议声明的方法。
8.What is lazy loading(什么是懒加载)?
懒加载,又称为延迟加载。通常用法,你有一个UITextField类 型的property,简单定义为userNameTextField,但是你不在初始化方法里为其alloc/init,它就只是一个指针,不会占用内 存。在访问器里判断此property的指针是否为空,若为空,就alloc/init,这时才真正生成这个对象除非这个对象被使用,否则它永远不会真正生成,也就不会占用内存。
9.什么是Protocol
?什么是代理?写一个委托的interface
?委托的property
声明用什么属性?为什么?
协议提供了一组方法,但是并不负责实现,如果一个类遵循了某个协议,并且实现了协议里面的方法,那么我们称这个类就是遵循了某个协议的代理。属性的声明使用assign,防止出现循环引用的问题。
10.分别描述类别(categories
)和延展(extensions
)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category
只能为对象添加方法,却不能添加成员变量?
category类目:在不知道源码的情况下为一个类扩展方法,extension:为一个类声明私有方法和变量。继承是创建了一个新的类,而类别只是对类的一个扩展,还是之前的类。类目的作用就是为已知的类添加方法。
category是为已有的类动态添加新的行为,不能添加新的成员变量,在.h文件中为什么添加了x和y的变量?
这个就要弄清@property关键字了,在类中@property关键字会生成私有成员变量,和申明getter setter方法,但是在分类中只会声明getter和setter方法,不会生成成员变量
扩展: 如果在.m中手动实现了setter和getter方法,x-code就不会自动生成@synthesize,也就不会生成成员变量
点语法访问的是getter方法,对象的->调用才是访问的成员变量
如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数:
objc_setAssociatedObject
objc_getAssociatedObject
面试题11
1.Objective-C
有私有方法么?私有变量呢?如多没有的话,有没有什么代替的方法?
objective-c 里面没有私有方法, 有私有变量. @private来修饰私有变量
2.#import
、#include
和@class
有什么区别
#include
c语言中引入一个头文件,但是可能出现交叉编译, OC里面已经没有这个方式引入头文件了, 统一使用#import #import在OC中引入自己创建的头文件#import””或者系统框架#import<>。#import不会出现交叉编译
@class对一个类进行声明,告诉编译器有这个类,但是类的定义什么的都不知道.
3.谈谈你对MVC
的理解?为什么要用MVC
?在Cocoa
中MVC
是怎么实现的?你还熟悉其他的OC
设计模式或别的设计模式吗?
MVC是Model-VIew-Controller,就是模型-视图-控制器, MVC把软件系统分为三个部分:Model,View,Controller。在cocoa中,你的程序中的每一个object(对象)都将明显地仅属于这三部分中的一个,而完全不属于另外两个。MVC可以帮助确保实现程序最大程度的可重用性。
各MVC元素彼此独立运作,通过分开这些元素,可以构建可维护,可独立更新的程序组建, 提高代码的重用性.model数据模型,view是对这些数据的显示,viewcontroller就是把model拿到view中显示,起到model和view之间桥梁的作用。
单例模式,delegate设计模式,target-action设计模式
4.如何监测系统键盘的弹出
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(name:) name:UIKeyboardWillShowNotification object:nil];
与系统自带的一些控件进行交互的时候,我们一般还是用通知中心,因为系统已经帮我们生成了固定的name来监听这些控件上的事件。
可以看看IQKeyboardManager这个第三方库.
5.举出5个以上你所熟悉的iOS SDK
库有哪些和第三方库有哪些?
Foundation,CoreGraphics绘图,UIKit布局, MapKit显示地图, CoreLocation定位,
CFNetWork, MessageUI, ImageIO, CoreData,
AFNetWorking, MKNetWorkKit, ASIHttpRequest, FMDB, ZXing, Zbar扫描, SDWebImage异步加载图片
6.如何将产品进行多语言发布?
7.如何将敏感字变成**
字符串替换stringByReplacingOccurrencesOfString: withString:
8.objc
中的减号与加号代表什么?
+静态方法,也叫类方法,-实例方法, 当然也是运算符
9.单例目的是什么,并写出一个?
10.说说响应链
当事件发生的时候,响应链首先被发送给第一个响应者(往往是事件发生的视图,也就是用户触摸屏幕的地方)。事件将沿着响应者链一直向下传递,直到被接受并作出处理。一般来说,第一响应这是个视图对象或者其子类,当其被触摸后事件就交由它处理,如果他不处理,事件就会被传递给视图控制器对象UIViewController(如果存在),然后是它的父视图对象(superview),以此类推直到顶层视图。接下来会沿着顶层视图(top view)到窗口(UIwindow 对象) 再到程序的(UIApplication对象),如果整个过程都没有响应这个事件,则该事件被丢弃,一般情况下,在响应链中只要有对象处理事件,事件就会被传递.
面试题12
1.请写出代码,用blocks
来取代上例中的protocol
,并比较两种方法的优势。实际应用部分?请写出代码,用blocks
取代协议或回调方法
声明:
#import <Foundation/Foundation.h>
typedef void(^TestBlock)(NSString *string);
@interface LO_Person : NSObject
+ (void)showStringFromBlcok:(TestBlock)justBlock;
@end
实现: #import "LO_Person.h"
@implementation LO_Person
+ (void)showStringFromBlcok:(TestBlock)justBlock {
NSString *str = @"测试blcok";
justBlock(str);
}
@end
调用:
[LO_Person showStringFromBlcok:^(NSString *string) {
NSLog(@"-- %@",string);
}];
2.你做iphone
开发时候,有哪些传值方式,C和C之间是如何传值的?
属性、delegate、block, 通知, 单例
3.给定的一个字符串,判断字符串中是否还有png
,有就删除它?
[string stringByReplacingOccurrencesOfString:@"png" withString: @""]
4.对于语句
NSString* testObject = [[NSData alloc] init];
testObject在编译时和运行时分别是什么类型的对象?
编译的时候是NSString类型,运行的时候是NSData类型
5.OC
中是所有对象间的交互是如何实现的?
消息发送机制
6.目标-动作机制
目标是动作消息的接收者。动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。常用的UIButton添加方法
iOS 开发之Target-action模式
7.这段代码有什么问题?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?
for(int index = 0; index < largenumber; index ++) {
NSString *tempStr = @"tempStr";
NSLog(tempStr);
NSNumber *tempNumber = [NSNumber numberWithInt:2];
NSLog(tempNumber);
}
如果数字很大的话会造成内存一直增加(因为一直通过便利构造器方法创建autorelease对象),直到循环结束才减少,在循环内加一个自动释放池,
for(int index = 0; index < largenumber; index ++) {
@autoreleasepool {
NSString *tempStr = @"tempStr";
NSLog(tempStr);
NSNumber *tempNumber = [NSNumber numberWithInt:2];
NSLog(tempNumber);
}
}
8.描述上拉加载、下拉刷新的实现机制?
一般上拉加载和下拉刷新是使用在请求网络数据的时候, 根据下拉或者上拉的距离来判断是否进行网络请求, 当请求结束以后, 将收回上拉或者下拉的提示框.
9.什么是沙盒(sandbox)?沙盒包含哪些文件,描述每个文件的使用场景。如何获取这些文件的路径?如何获取应用程序包中文件的路径?
iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去 其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。 默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
tmp:提供一个即时创建临时文件的地方。
iTunes在与iPhone同步时,备份所有的Documents和Library文件。iPhone在重启时,会丢弃所有的tmp文件。
10.介绍一下XMPP
?有什么优缺点吗?
XMPP:基于XML的点对点的即时通讯协议。 XMPP 协议是公开的,XMPP 协议具有良好的扩展性,安全性 缺点是丢包率比较高
11.谈谈对性能优化的看法,如何做?
从用户体验出发:
1、程序logging不要太长
2、相同数据不做重复获取
3、昂贵资源要重用(cell、sqlite、data)
4、良好的编程习惯和程序设计:选择正确的集合对象和算法来进行编程、选择适合的数据存储格 式(plist、SQLite)、优化SQLite查询语句
5、数据资源方面的优化(缓存和异步加载)
6、永远不要一直请求M7协处理器几率的数据, 会造成设备发热.
解决方案:
• 能够发现问题
• 利用log或工具分析问题原因
• 假设问题原因
[改进代码和设计] http://blog.csdn.net/yangxt/article/details/8173412
面试题13
1.应用程序如何省电?
1:及时关闭定位.
2不要频繁的请求网络,作本地存储.让用户主动的更新数据(上下拉刷新).
3:提升程序的算法,优化代码,提高代码的质量.
4:蓝牙, 需要才连接,用完及时断开.
5:界面的渲染,(游戏中)尽量提升效率,减少渲染次数.
2.写一个递归方法:计算N
的阶乘,然后将计算结果进行存储。以便应用退出后下次启动课直接获取该值。
- (double)fun:(int)n {
if (n == 0 || n == 1) {
return 1;
} else
return n * fun(n-1);
}
3.NSArray
和NSMutableArray
的区别,多线程操作哪个更安全?
NSArray不可变数组,NSMutableArray可变数组,NSArray更安全,多线程操作的时候记得加锁。GCD线程是安全的.
4.当前有一个数组,里面有若干重复的数据,如何去除重复的数据?(会几个写几个)
最简单的方式,把数组里面的元素放到集合里面。 也可以对数组进行排序,排序之后把数组里相同的元素删除掉 放进字典里面, 把数组里面的元素当做key.
5.isKindOfClass
、isMemberOfClass
作用分别是什么?
-(BOOL) isKindOfClass: classObj
判断是否是这个类或者是这个类子类的实例
-(BOOL) isMemberOfClass: classObj
判断是否是这个类的实例
6.写出下面程序段的结果
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"];
NSLog(@"%@", [dict objectForKey:@"akey"]);
[dict release];
7.请写出以下代码的执行结果
NSString * name = [ [ NSString alloc] init ];
name = @”Habb”;
[ name release];
第一行:[ [ NSString alloc] init ]在堆区开辟一块内存,name指向堆区的这快内存,
第二行:name指向常量区,这个时候堆区的内存没有释放也没有指针指向,会造成内存泄露
8.请分别写出SEL
、id
的意思?
SEL选择器, id泛对象类型,id 不是类型,只是在编译的时候不指定它的类型,把类型的确定放到程序运行过程中。
9.iPhone
上,不能被应用程序直接调用的系统程序是什么?
时钟、视频、指南针、天气、计算器、备忘录、提醒事件、股市
10.以.mm
为拓展名的文件里,可以包含的代码有哪些?c
和obj-c
如何混用
- obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码, 处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj- c的代码,因为cpp只是cpp
- 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
3)在cpp中混用obj- c其实就是使用obj-c编写的模块是我们想要的。 如果模块以类实现,那么要按照cpp class的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。 如果模块以函数实现,那么头文件要按 c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m
11.说说如何进行后台运行程序?
1.检查设备是否支持多任务
- (BOOL) isMultitaskingSupported{
BOOL result = NO;
if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { result = [[UIDevice currentDevice] isMultitaskingSupported]; }
return result;
}
applicationDidEnterBackground和applicationWillEnterForeground
(UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForegroundNotification)
3.声明你需要的后台任务(在Info.plist中添加Required background modes键值:audio、location)
12.sizeof
和strlen
的区别和联系
sizeof是运算符,strlen是函数
char str[20] = "0123456789";
int a = strlen(str);
//a = 10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b = sizeof(str);
//而b = 20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
13.sprintf
,strcpy
,memcpy
的功能?使用上要有哪些要注意的地方
char *strcpy(char *dest, const char *src);
其对字符串进行操作,完成从源字符串到目的字符串的拷贝,当源字符串的大小大于目的字符串的最大存储空间后,执行该操作会出现段错误。
int sprintf(char*str, const char *format, ...) 函数操作的源对象不限于字符串:源对象可以是字符串、也可以是任意基本类型的数据。
主要是实现将其他数据类型转换为字符串 void memcpy(voiddest, const void *src, size_t n) 实现内存的拷贝,实现将一块内存拷贝到另一块内存。该函数对源对象与目的对象没有类型现在,只是对内存的拷贝
14.自己写函数,实现strlen
功能
判断的时候注意“\0”
15.写一个代码片段输入一个字符串“20130322152832”
,输出一个NSDate
类型的对象,打印该对象输出2013-03-22 15:28:32
16.找错误
a:void test1()
{
char string[10];
char* str1 = "0123456789";
strcpy( string, str1 );
}
b:void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
}
分配了内存空间,但是没有释放 , 释放空间用free关键字
面试题14
1.数据持久化存储方案有哪些?
2.沙盒的目录结构是怎样的? 各自一般用于什么场合?
3.如何处理多个网络请求并发的情况.
4.NSThread
中的Runloop
的作用, 如何使用?
5.内存中的栈和堆的区别是什么? 哪些数据在栈上, 哪些在堆上?
6.runtime
的概念, message send
如果寻找不到对应的对象, 会如何解决?
面试题15
1.对于 Objective-C
, 你认为它最大的优点和最大的不足是什么? 对于不足之处, 现在有没有可用的方法绕过这些不足来实现需求, 如果可以的话, 你有没有考虑或者实践过重新实现 OC
的一些功能, 如果有, 具体说如何做?
2.利用NSOperation
与 NSOperationQueue
处理多线程时, 有3个NSOperation
分别为 A
, B
, C
要求 A
, B
执行完之后, 才执行 C
, 如何做?
3.详细说明一下 APP
的启动过程, 从 main
文件开始说起, main.m
中有什么函数, 作用是什么?
4.UIKit
和 CoreAnimation
和 CoreGraphics
的关系是什么? 在开发中是否使用过 CoreAnimation
和 CoreGraphics
?
5.多线程 Core Data
中, NSPersistentStoreCoordinator
, NSManagedObjectContext_________
和 NSManagedObject
中的哪些需要在线程中创建或者传递? 你是用什么样的策略来实现的?
6.readwrite
, readonly
, assign
, retain
, copy
, nonatomic
各有什么作用? 在哪种情况下用?
7.请简单的说一下 HTTP
协议中 GET
和 POST
方法的区别.
8.用Objective-C
实现 100
以内的斐波那契数列的打印输出.
9.在项目开发中常用的开发工具有哪些(调试工具, 代码管理工具, 项目管理工具, 效率__工具)? 有哪些使用心得?
10.从设计模式的角度分析 Delegate
、 Notification
、 KVO
的区别? iOS SDK___framework
中用到了哪些设计模式, 为什么使用, 有哪些好处和坏处?
面试题16
1.编写一个线程安全的单例.
2.声明并实现一个Block
.
3.简述MVC
的思想以及在程序中如何体现?
4.简述 Objective-C
的消息机制?
5.列出六种以上会引起程序崩溃的情况.
6.Objective-C
下的多线程有有哪几种? 它们之间有哪些区别?
7.列出项目开发过程中经常使用的第三方类库 (至少6个).
8.Objective-C
下有哪些数据持久化方式?
9.简述Objective-C
的手动内存管理机制.
10.简述AutoLayout
与传统布局有哪些区别?
面试题17
一、关于 iOS 技术
1.请解释一下 Handoff
是什么, 并简述它是如何实现 iOS
、 Mac
/网页应用互通的.
2.iCloud
包含了哪些技术与服务?
3.iOS
扩展是指? 能否列举一些热门或常见的范例?
4.HealthKit
是什么?
5.HomeKit
是什么?
6.Apple Pay
是什么? 能否描述一下如何在应用中使用 Apple Pay
?
7.请解释一下 iOS
应用沙盒机制.
8.VoiceOver
是什么? 请举例解释一下 iOS
中的辅助功能 (Accessibility
). 开发者如何使用这些功能?
9.iOS
应用是如何实现后台多任务处理 (Multitasking
) 的?
10.Game Center
针对 iOS
游戏有哪些功能?
11.iBeacons
是什么?
12.Cocoa
/Cocoa Touch
是什么?
13.请概括一下 Core Audio
, Core Data
以及 Core Location
各是什么. 它们对 iOS
应用有何意义?
14.请描述 SpriteKit
和 SceneKit
的作用.
15.Metal
是什么?
16.响应链 (Responder Chain
) 是什么? 它是如何发挥作用的?
17.按钮和其他控制方式对哪些操作做出回应?
18.AppDelegate
扮演者什么样的角色?
19.请解释一下 NSUserDefaults
. 就你而言, 你会如何在磁盘中对数组对象进行序列化?
20.你会如何储存用户的认证信息
?
21.请问何为 Keychain
服务?
22.为什么移动设备上的缓存和压缩是不可或缺的?
23.请解释一下~/Documents
, ~/Library
和~/tmp. iOS
中的~
属于什么目录?
24.AirPlay
是如何运行的? 换做是你, 你会如何通过编程提高应用的实用性以及演示效果?
25.传感器, IO
以及 WIFI
、 拨号等连接方式如何在 iOS
平台上运作? 它们有何利用价值? 请扼要地谈谈你的观点.
26.iPad 2
, iPad mini 1-3
, iPad Retina
, iPad Air 2
, iPhone 5
、 5S
、 6
以及 6+
在硬件性能方面有何差异? 这对注重性能的应用有何限制?
二、关于编程
1.Cocoa Touch
包含什么? 不包含什么?
2.为什么 Cocoa Touch
的类名称是以两个大写字母开头的?
3.Swift
和 Objective-C
分别是什么? 两者相比有何不同之处, 又有何联系?
4.为什么 Optional
在 Swift
语言中非常重要?
5.请解释一下 NSError
. 在 Swift
中, 什么情况下能使用NSError
, 什么情况下不能?
6.请说明如何用 Instancetype
及其重要性.
7.在 Swift
中, 什么时候该用 let
, 什么时候该用 var
?
8.为什么 map
函数必不可少? 该在什么情况下使用它?
9.你会选择什么工具来追踪 Bug
?
10.如果在 Cocoa
中发现一个 Bug
, 你会如何处理?
11.如果应用的新版本出现了 Regression
的情况, 该如何补救? 如何防止用户在使用过程中遇到新的 Bug
?
12.Objective-C
的类是怎么执行的? Objective-C Runtime
是如何实现的?
13.iOS
是如何提高安全性的, 保护用户隐私信息的?
14.应用可以下载并即刻显示数据. 如何根据 MVC
来判断下载的最佳位置?
15.MVC
对代码库 ( Codebase
) 的设计有何影响?
16.Controller Life
-CyCle
以及View Life
- cycle
分别有哪些调试方法?
17.iOS
使用的是哪些设计模式 ( Design Patterns
)? 你的代码库使用的是哪些设计模式?
18.iOS
提供哪些线程? 如何充分利用这些线程?
19.请简要描述一下 UIScrollView
的执行过程. 它是如何响应手势识别 ( Gesture Recognizer
)、 多点触控 ( Multi-Touch
) 和 Run Loop
的?
20.你认为 iOS
需要添加或改进哪些 API
?
三、 关于界面
1.iPhone5
、 6
、 6+
以及 iPad Air 2
的屏幕分辨率分别是多少?
2.分辨率的计算单位是什么?
3.请解释一下 Interface Builder
的作用以及 NIB
文件的概念.
4.iOS
UI
的图像存储类型是什么?
5.请描述一下 Storyboard
和标准 NIB
文件的差别.
6.设备状态栏 ( Device Status Bar
) 是什么? 高度如何? 是否透明? 在手机通话或者导航栏状态下, 它是如何显示的?
7.导航栏 ( Navigation Bar
) 是什么? 能否拿出你的iPhone
, 指出你下载的哪些应用运用了导航栏?
8.选项卡 ( Tab Bar
) 和工具栏 ( Toolbar
) 分别是什么? 两者之间有何共同点和不同点?
9.表视图 ( Table View
) 是什么? 集合视图 ( Collection View
) 又是什么?
10.什么时候用 “弹出 ( Popover
)” 属性最为合适?
11.Split-view Controller
是什么?
12.选取器视图 ( Picker View
) 适合存放哪类内容?
13应该在什么情况下使用标签、 文本域和文本视图?
14.分段控件 ( Segmented Control
) 的作用是什么?
15.模态视图 ( Modal View
) 是什么?
16.iOS
通知属于什么类型?
四、 关于设计
1.iOS
应用图标是指什么? 请尽可能详细地描述一下.
2.最小尺寸和最大尺寸的应用图标分别是什么样子的?
3.应用图标能否包含透明的部分?
4.Newsstand
的图标与常规应用有何不同?
5.请解释一下启动画面 (Launch Images
).
6.自动布局 ( Auto Layout
) 的作用是什么? 请概括一下它是如何运行的.
7.设计软件时为什么要加上动画?
8.请描述一下软件设计中的交互和 Feedback
有什么作用.
9.设计 iPhone
和 iPad
应用时, 应分别考虑哪些因素?
10.请描述一下原型设计对于软件开发的意义. 其作用是什么?
五、 关于 App Store
1.应用内购买 ( In-App-Purchases
) 是怎么回事? IAP
能够为用户带来哪些新体验?
2.你是否在 App Store
上发不过应用? 能否概括一下过程?
3.iTunes Connect
是什么?
4.Provisioning Profiles
是指?
5.App ID
是什么?
6.iOS
的开发和发布签名证书有何异同?
7.如何使用 TestFlight
? 通过 Ad-hoc
发布应用的话, 该如何使用 UUID
?
8.应何时验证购买收据?
9.发布iAds
( 苹果平台广告 ) 有哪些要求?
六、 趣味问答
1.最近有没有开发什么好玩的东西? 你最引以为豪的作品是什么?
2.谈一谈你常用的开发工具都有哪些优势?
3.你最敬佩的独立 Mac
或者 iOS
应用开发者是谁?
4.最喜欢什么项目? 哪种类型的?
5.你觉得 Xcode
有哪些需要改进的地方?
6.iOS
上你最喜欢哪些 API
?
7.是否有最中意的错误报告?
8.你最爱以哪种方式来检验一项新技术是否好用?
9.为什么词典被称作 Dictionaries
, 而不是 HashTable
或 HashMap
?
面试题18
1.ARC 模式下,下面的代码有什么问题
@interface MyView () {
NSTimer *timer;
}
@end
@implementation MyView
-(id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithcoder: aDecoder]) {
timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES];
}
return self;
}
-(void)dealloc {
[timer invalidate];
}
-(void)handleTimer:(NSTimer *)timer {
// do something
}
@end
2.给定任意一个 json
格式的字符串(数据格式是随机的,但符合 json
格式),找出其中小于0的整数,并打印出全路径和数值,例如, 输入如下的 json
面试题19
一.选择题 (12’)
1.什么是 key window
? ( C ) (3’)
A.App中唯一的那个 UIWindow
对象
B.可以指定一个 key
的 UIWindow
C. 可接收到键盘输入等事件的 UIWindow
D.不可以隐藏的那个 UIWindow
对象
2.需要在手动管理内存分配和释放的 Xcode
项目中引入和编译用 ARC
风格编写的文件,需要在文件的 Compiler Flags
上添加参数( C ) (3’)
A.-shared
B.-fno-objc-arc
C.-fobjc-arc
D.dynamic
3.在 UIKit
中, frame
与 bounds
的区别是什么 ( C ) (3’)
A.frame
是 bounds
的别名
B.frame
是 bounds
的继承类
C.frame
的参考坐标是父视图坐标, bounds
的参考坐标是自身坐标
D.frame
的参考系是自身坐标, bounds
的参考坐标是父视图的坐标
4.一个类的 delegate
(代理)的作用不正确的是( D ) (3’)
A.delegate
中的函数在其他类中实现
B.主要用于不同类型的对象之间一对一传递消息
C.没有指派则不会触发
D.可以一个对象的 delegate
指派给多个其他类型的对象
二.简答题 (58’)
1.说明 Object-c
Automatic Reference Counting
(ARC)与垃圾回收机制的区别? (3’)
ARC
是编译时决定的
垃圾回收是要消耗性能和在运行时管理
2.weak
与 assign
的区别
weak
在 ARC
环境中,对对象的弱引用,不增加引用计数
assign
是对基本数据类型(int
, float
等)的直接持有
面试题20
1.描述下 iOS SDK
中 MVC
的开发模式?平时做项目是代码编写,还是 Storyboard
?
2.oc
内存管理的理解
3.做过的项目是否涉及网络访问功能,使用什么对象完成网络功能?
4.如何获得一段文字的高度(宽度一定,高度动态)?
5.如何获得网络图片的大小?
6.简要概述单例模式,举例说明 iOS
中的单例模式应用,写一个单例
7.卡顿(特指不流畅的动画)是 App
开发中最为常见的性能问题表现,解释一下 App
中卡顿的发生机理,并分别针对界面切换卡顿和屏幕滑动卡顿提出典型的优化思路.
8.由于 App
启动环节的感受对用户体验影响较大,请列举一些导致 App 启动慢的原因,并说出解决方法.
9.实例化一个 UITableView
对象 写出关键语句以及必要的实代理方法?
10.oc
是动态运行时语言是什么意思?说说你的理解.
面试题21
1.执行这段代码的结果是什么,为什么?
NSMutableArray *array =[NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
[[array copy] removeObjectAtIndex:0];
NSLog(@"%@", array);
a.同一个 Class 内是否有可能同时出现上方的代码,如果不可能,请说明理由,如果可能,请举例说明:
b.weak 是防止循环引用而采用到地方,那如果用strong 怎样发生了循环引用呢,循环引用会发生什么事情?
c.weak和 assign 有什么区别?
@property(nonatomic, weak, nullable)id<ADelegate>delegateA;
@property(nonatomic, weak, nullable)id<BDelegate>delegateB;
ClassA.h
@interface ClassA:UIView
@property(nonatomic,strong)UIButton *btn;
-(void)doSth;
@end;
ClassA.m
-(void)doSth {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//someCode
[manager GET:url] parameters:@{} success: ^(AFHTTPRequestOperation *operation, id responseObject) {
_btn.userInteractionEnabled = false;
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
}
_btn.userInteractionEnabled = false;
这一行这样写可以吗?如果可以,还有什么写法?如果不可以,请写出正确的写法.
4.简单描述下继承模板类和遵守协议的区别和柯里化的异同
面试题22
1.什么是 ARC
? 请简述一下 ARC
原理
2.简述视图控件器的生命周期
3.请描述一下线程的生命周期
4.请至少列举5个常用的设计模式
5.如何增强 iOS
应用程序的性能
6.请列举至少5个 iOS
中常用的第三方类库
7.队列和栈有什么区别
8.常用的 XML
文件的解析方式有哪些?它们各自的区别是什么?
9.请介绍几个常用的 git
命令
10.请简单描述一下自己的职业生涯规划
面试题23
1.写一个 Delegate
, 包括协议的声明,委托类,实现.
2.解释浅复制和深复制的区别?
浅复制:
被复制对象的所有变量都含有与原来的对象相同的值,而其所有的对其他对象的引用都仍然指向原来的对象。 一个对象中的字段有的是值类型的,有的是引用类型的。对于值类型字段来说,它的值就是简单的值,而对于引用类型来说,它的值是地址。
浅复制在复制时,将这个对象的值字段和引用字段(均为非静态字段)全部复制过去,获得了这个对象的值和地址。
即:当其中一个对象的引用字段所指向的地址中的变量变化时,所有浅复制对象中的该引用字段都会发生变化。
深复制:
被复制对象会将所有非引用类型的字段复制给新对象,同时将引用类型所指向地址中存的对象复制给新的对象。
简单的来说, 在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!
区别:
浅复制和深复制的区别仅在于对引用类型的对待上,一个是复制的地址,一个是复制的地址指向位置的数据.
浅复制尽复制对象本身,对象里的属性、包含的对象不做复制
深复制复制全部,包括对象的属性和其他对象
代码理解部分:
NSMutableArray *array=[[NSMutableArray alloc] init];
for(int i=0;i<3;i++)
{
NSObject *obj=[[NSObject alloc] init];
[array addObject:obj];
[obj release];
}
for(NSObject *obj1 in array)
{
NSLog(@"地址为 %p,引用计数是 %ld",obj1,obj1.retainCount);
}
NSMutableArray *array2=[array copy];
for(NSObject *obj2 in array2)
{
NSLog(@"地址为 %p,引用计数是 %ld",obj2,obj2.retainCount);
}
打印结果为:
2013-09-30 17:28:01.492 FDAS[681:303] 地址为 0x1001081f0,引用计数是 1
2013-09-30 17:28:01.506 FDAS[681:303] 地址为 0x100108230,引用计数是 1
2013-09-30 17:28:01.506 FDAS[681:303] 地址为 0x100108240,引用计数是 1
2013-09-30 17:28:01.507 FDAS[681:303] 地址为 0x1001081f0,引用计数是 2
2013-09-30 17:28:01.507 FDAS[681:303] 地址为 0x100108230,引用计数是 2
2013-09-30 17:28:01.507 FDAS[681:303] 地址为 0x100108240,引用计数是 2
3.属性readwrite
, readonly
,assign
,retain
,copy
,nonatomic
各是什么作用,在那种情况下用?
4.解释什么是多态,并举一个具体实例说明.
5.描述一下 iOS
开发中的 MVC
模式
6.iOS
开发中的界面布局三种基本方式及其特点
7.tableview
显示过程中图片条目过多,会遇到什么问题?怎么理解并解释其原理?
8.请举例 iOS7
与 iOS8
之间的不同
9.HTTP
请求由那几部分组成,有几种常用的请求方式,常见的响应码有哪些?
10.获取一个新闻列表后,按本地时间戳缓存到本地,以便应用重启后,即使不联网,仍能显示之前的缓存数据,每次只显示100条,如果本地缓存不足100,则显示本地所有的缓存,总是优先显示时间戳最新的新闻,不能显示重复的新闻(假设每次一定数量的新闻,依据新闻 id, 当前请求可能会与上次请求的新闻部分相同),不需要考虑网络问题和 ui 显示,只需要专注缓存,请进行程序设计,尽量细节(具体用什么技术,具体实现中可能会遇到的问题,如效率回答为题等)
网友评论