16年第一份笔试题,其实内容每年都比较类似,基于去年一年的项目和学习,简单做一下记录,
深感“吾生也有涯,而知也无涯”,做份记录积累。
1. 怎样把NSArray转换为NSMutableArray?
NSMutableArray *temp = [array mutableCopy]
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];
2. 如何把NSArray里NSNumber对象以顺序或反序排序?
NSArray *sortedArray = [mTest sortedArrayUsingComparator:^NSComparisonResult(NSNumber *p1, NSNumber *p2){
return [p1 compare:p2];
}];
NSArray *reverseArray = [mTest sortedArrayUsingComparator:^NSComparisonResult(NSNumber *p1, NSNumber *p2){
return [p2 compare:p1];
}];
3. 如何从Core-Data数据库取数据?
学习Code-Data 因为线程安全等问题不是太友好,所以在现在项目中使用MagicalRecord作为数据持久化的工具,github地址如下所示: https://github.com/magicalpanda/MagicalRecord
MagicalRecord中对NSManagedObject进行了扩展【NSManagedObject (MagicalFinders)】,可以使用
+ (MR_nullable MR_NSArrayOfNSManagedObjects) MR_findAll;
找出该类所有的对象,再根据条件筛选
或直接使用NSPredicate 对该类进行筛选。
+ (NSArray *) MR_findAllWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context
4. Core-Data是线程安全吗,如不是,可以怎样做才可以是线程安全?
CoreData中的NSManagedObjectContext在多线程中不安全,如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext,
,每个NSManagedObjectContext对象实例都可以使用同一个
NSPersistentStoreCoordinator实例,这个实例可以很安全的顺序访问永久存储,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁。
5.如何实现asynchronous dispatch block?
6. 在ARC里,弱引用和强引用有什么区别?
强引用持有对象,弱引用不持有对象。
强引用可以释放对象,但弱引用不可以,因为弱引用不持有对象,当弱引用指向一个强引用所持有的对象时,当强引用将对象释放掉后,弱引用会自动的被赋值为nil,即弱引用会自动的指向nil。
7. view第一次起动时的生命周期是什么呢?重载(reoload)及移除(remove)时生命周期又是什么?
8. UITableView及UICollectionView有什么区别?
涉及内容很多,该文章可以看看
9. 如何以UIWebView显示www.apple.com网页的内容?
1.新建UIWebView,添加到view中;
2.写好地址为”http://www.apple.com“的NSURLRequest;
3.webview 设置好delegate,调用加载方法,加载该NSURLRequest。在delegate方法中检查加载状态
UIWebView *webView = [[UIWebView alloc]initWithFrame:self.view.frame];
webView.delegate = self;
[self.view addSubview:webView];
NSString *urlStr = @"http://www.apple.com";
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:urlStr]];
[webView loadRequest:request];
10. 定议属性时,什么情况用copy,assign和retain?
1.assign: 简单赋值,不更改索引计数,适用简单数据类型基础 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等)
2. copy:建立一个索引计数为1的对象,然后释放旧对象,适用NSString,在赋值时使用传入值的一份拷贝。
3.retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1(对参数进行release旧值,再retain新值) 适用于其他NSObject和其子类
11. 什么是Notification?
消息通知,多对一的一种消息传递方式
12.viewController的loadView,viewDidLoad,viewDidUnload分别是在什么时候调用的?
1.loadView:view准备加载到当前屏幕时,检查当前view不存在,调用loadView加载
2.viewDidLoad:loadView加载完成后,调用
3.viewDidUnload:view不再显示在当前屏幕时,调用。
13.类工厂方法是什么?
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并进行自动释放处理。
14.单件实例是什么?
在当前进程中的唯一实例
15.动态绑定
Objective-C不同于传统程序设计语言,它可以再运行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载
动态类型能使程序直到执行时才确定对象所属类型
动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法
16.自动释放池是什么?如果工作的?
自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放
自动释放池本事销毁的时候,池子里面所有的对象都会做一次release操作
17.给定一个单向链表,求出该链表倒数第m个元素(m>0)
struct Item{
int iValue;
Item *pNext;
};
Item getItem(Item *item,int m);
算法1:首先遍历,求出链表长度,再定位到倒数第m个元素(比较笨的方法)
算法2:定义两个指针,之间距离为m-1(倒数第m个元素距离最后一个元素m-1的距离),同时向后遍历,直至后一个指针到达链表最后一个元素时,前一个指针指向倒数第m个元素
算法3:递归思想做,暂时没写出来
#include
#include
typedef struct Item
{
int iValue;
struct Item *pNext;
}Item;
void create_link(Item *head, int num[], int len)
{
int i;
for(i = 0; i < len; i ++)
{
head->pNext = (Item *)malloc(sizeof(Item));
head->pNext->iValue = num[i];
head->pNext->pNext = NULL;
head = head->pNext;
}
}
//算法1
Item* getItemAtIndex(Item *head, int index){
int length =0;
Item *temp = head;
while(temp->pNext!=NULL){
length+=1;
temp = temp->pNext;
}
temp = head->pNext;
for (int i = 0; i < length-index; ++i)
{
temp = temp->pNext;
}
return temp;
}
//算法2
Item* getItemAtIndex2(Item *head, int index){
Item *temp1 = NULL;
Item *temp2 = head;
int length = index-1;
while(length>0){
temp2 = temp2->pNext;
length --;
}
temp1 = head;
while(temp2->pNext!=NULL){
temp2 = temp2->pNext;
temp1 = temp1->pNext;
}
return temp1;
}
void clear_link(Item *head)
{
Item *p, *q;
for(q = head, p = head->pNext; p; q = p, p = p->pNext)
{
free(q);
}
free(q);
}
void walkThrough(Item *head){
int index =0;
while(head!=NULL){
printf("The node number %d is: %d.\n", index, head->iValue);
index++;
head= head->pNext;
}
}
int main()
{
Item *head;
int num[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
head = (Item *)malloc(sizeof(Item));
head->iValue = 0;
head->pNext = NULL;
create_link(head, num, 10);
walkThrough(head);
int index = 3;
Item *node =getItemAtIndex(head,index);
printf("The node number %d is: %d.\n", index, node->iValue);
Item *node2 =getItemAtIndex2(head,index);
printf("The node number %d is: %d.\n", index, node2->iValue);
clear_link(head);
head = NULL;
return 0;
}
18.非递归实现折半查找数据元素x
int serach(int a[],int x, int low,int high){
int mid;
if(low>high) return -1;
while(low <= high){
mid = (low +high)/2;
if(x == a[mid]) return mid;
else if(a[mid] mid +1;
else if (a[mid]>x) high = mid -1;
}
return -1;
}
19.OC中线程中描述不正确的是?
A.使用NSThread创建、使用GCD的dispatch
B.直接使用NSOperation,然后将其加NSOperatinQueue;
C.在主线程执行代码,方法时performSelectorOnMainThread
D.如果想延时执行代码可以用
performSelector:onThread:withObject:wainUtilDone:
20.在ARC的情况下,容易造循环引用的情况有哪些?
1.父子对象关系
2.当 Block 和闭包包含在类的成员变量中
3.GCD: dispatch_async
4.本地闭包和 block
5.代理协议
所以delegate、block、dispatch_async时要使用weak
21.iOS的设计模式中,代理模式和观察者模式,两者有什么区别?分别用于什么场合?
代理是一种简单而功能强大的设计模式,这种模式用于一个对象“代表”另外一个对象和程序中其他的对象进行交互。
观察者模式:对象对指定的对象的特定属性进行注册观察,当指定的对象的属性被修改后,则对象就会接受到通知。每次指定的被观察的对象的属性被修改后,KVO自动通知相应的观察者。
对于IOS开发过程中MVC设计模式下,斯坦福ios公开课给出的一张图可以看出各种模式适用的环境范围。
22.你切换界面用到了哪些方式?
1.使用UINavigationController管理页面逻辑的,会用到push、pop;
2.不适用UINavigationController,可以使用present、add
23.kvc是什么,kvo是什么,有什么特性?
KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,可以直接通过 name/key 直接访问对象的属性。可以使得一个对象所有的属性可以通过一个统一的方式进行操作。是KVO的基础
Key-Value Observing (KVO) 建立在 KVC 之上,它能够观察一个对象的 KVC key path 值的变化。
24.请简述Get请求和Post请求的区别,以及他们的使用场合?
Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中实质上,GET和POST只是发送机制不同,并不是一个取一个发
25.怎么理解MVVM,在cocoa中MVVM如何实现?
26.点击Button响应链最终得到响应的是?
A.window,B.Application C.AppDelegate D.UIViewController
27.MVC优点不正确的是?
A.低耦合性,B.高重用性和可适用性 C、较低的生命周期成本 D、代码高效率
28.下面哪个方法不属于NSObject和内省(Instrospection)方法?
A、inti, B、isKindOfClass C、responseToselector D、isMemberOfClass
29、在UIKit中,frame与bounds的区别是
A,frame的参考系是父视图坐标,bounds的参考是自身的坐标
B,frame的参考系是自身的坐标,bounds的参考是父视图坐标
30.下面有哪些问题?
NSTimer *mT = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(done) userInfo:nil repeats:YES];
[mT fire];
1.没有实现done;
2.timerWithTimeInterval 方法实现不了repeats:YES,需要使用
scheduledTimerWithTimeInterval
30.NSString *obj = [[NSSData alloc]init] ,obj在编译时和运行时分别是什么类型的对象?
编译时是nsstring, 运行时是nsdata的一个实例
31,什么是key window?
A.APP中唯一的那个UIWindow对象,
B.可以指定一个key的UIWindow
C.可以接收到键盘输入等事件的UIWindow
D.不可以隐藏的那个UIWindow对象
31.什么时沙盒?沙盒包含哪些文件,描述每个文件的使用场景。
IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
1.Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
2.Library:存储程序的默认设置或其它状态信息;
2.1Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
3.tmp:提供一个即时创建临时文件的地方。
32.介绍一下XMPP?有什么优缺点吗?
33.
NSArray *array = @[@[@"a",@"b"],[@[@"c",@"d"]];
NSArray *copyArray = [array copy];
NSMutableArray *mCopyArray = [array mutableCopy];
1> copyArray与array的地址是否一样?
2>mCopyArray和array的地址又是否一样?
3>改变mCopyArray里面的元素内容,是否会刻变array的内容?
4>copy和mutableCopy的拷贝操作有何不同?copy浅拷贝,只是指针的复制,而内容未复制;
mutableCopy是深拷贝,复制内容,新分配一段内存
所以:1.一样;2.不一样;3.不改变
34.请简述UIView与CALayer有什么不同。
作用:UIView可以响应事件,Layer不可以,UIView的绘制功能是CALayer的体现
坐标系统:CALayer的坐标系统比UIView多了一个anchorPoint属性,使用CGPoint结构表示,值域是0~1,是个比例值。
35.Block什么情况下会保留实体内引用到外部对象,什么时候要用__block或__weak
STATIC修饰符的全局变量 在加和不加 __block 都会直接引用变量地址。也就意味着 可以修改变量的值。
局部自动变量,在Block中只读。__block对象可以在block中被重新赋值
36.NSDictionary类使用了哪些数据结构和算法?
hashtable(所以NSDictionary中key必须唯一)
37.类方法、实例方法与Runtime特性的联系?
38.block调用时,变量的生命周期有哪几种,分别是什么样的?
39.CALayer的多个Sublayer的数据结构,以及重绘顺序?
40.写出UIViewController完整的生命周期
41.你有多少种方法为UIImage添加一个圆角
42.描述事件响应者链的工作原理
43.比较GCD和NSOperation的异同
44.NSTimer使用时注意事项(写两项即可)
同一个timer在重复使用之前必需invalidate, 否则会造成之前的timer无法停掉,两个timer同时存在。导致的现象就是timer同时更新两次。
不要在dealloc函数中停止并释放NSTimer
45.CoreAnimation是如何开始和结束显示动画?
46.写出一种你熟悉的与树相关的算法及其时间复杂度和空间复杂度