明天第一次iOS面试,这两天看了些面试题 ,还是把有些不会的题目 记录下来
Let's go
1.self.name = @"object " 和 _name = @"object"的不同?
前者是通过点语法修改属性name, 相当于调用 setter 方法
[self setName:@"object"]
后者只是单纯的把_name 指针指向@"object"所在的地址
2.简述面向对象的特点,特别是多态
封装 ,继承 ,多态
1.封装
把客观事物封装成抽象类
优点:增强安全性和简化编程,,使用者不必了解具体细节,只需要调用外部接口,隐藏内部实现细节.加快后期开发速度.
2.继承
继承父类,拥有父类的所有方法与属性,并在此基础上扩展(无需重新编写原来的类)
优点:简化编程
3.多态
父类的指针可以指向子类的对象.OC 是的方法都是虚方法,不看指针看对象.
不同的对象以自己的响应方式响应相同的消息的能力叫做多态.
生物类(life) 有方法- eat ,人和猪都是生物类的子类,,他们的 eat 不相同.
多态是为了实现一个目的----接口重用.(向 eat 方法的重用)
3.OC 所有对象间的交互是如何实现的?
正向:拿到接收的指针即可
反向:
1.委托代理
2.观察者模式(一对多)
3.block
4.AppDelegate (这是一个生命周期与进程一致的对象)
4.发送10个网络请求,然后再接收到所有回应之后执行后续操作,如何实现?
关于多线程,可以供 GCD 的 barrier 实现(group 同理),但用 barrier 不能使用 dispatch_get_global_queue,
dispatch_queue_t queue queue = dispatch_queue_create("one",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue,^{
//111
});
dispatch_async(queue,^{
//222
});
//执行完上面两个执行下面的方法
dispatch_barrier_async(queue,^{
//在上面两个执行完之后执行
});
下面用 group 做
dispatch_queue_t queue = dispatch_get_global_queue(0,0);
dispatch_group_t groupQueue = dispatch_group_create();
dispatch_group_async(groupQueue,queue,^{
//111
});
dispatch_group_async(groupQueue,queue,^{
//222
});
dispatch_group_notify(groupQueue,queue,^{
//上面执行完了 执行这个
});
4.不同版本的 app ,数据库结构变化了,如何处理
如果是移动端,很简单,最暴力的方法 只需要把原先的数据库删了,导入新的数据库文件即可.
如果是客户端,那是客户端的问题,根 iOS 移动端开发没多大关系,,,需要与客户端开发者沟通,,毕竟项目是多人合作才能完成的.
5.定义一个 block ,接收参数与返回值为 int 型,其他随意
typedef int (^myBlock)(int a, int b);
myBlock firstBlock;
firstBlock = ^(int a,int b){
};
6.堆和栈的区别
这个要说可以说很多啊
简单来说:
堆 :程序员手动申请,程序员手动释放 ,遵守黄金法则,谁申请,谁释放.
栈:编译器自动申请,自动释放..一种先进后出的数据结构
7.关于 UITableviewCell 的重用机制
通过重用单元格来节省内存
为每个 cell 指定一个重用标示符.
例子:假如一个 tableView 有十个 cell, 但一开始显示4个,系统一开始只分配了4个 cell 的内存,,当滚动的时候, 屏幕内显示的单元格重复使用这四个内存.
8.简单地说 sizeClass 的作用
sizeClass 是 iOS8之后出现的,,与 autoLayout 配合解决所有ios 设备屏幕尺寸以及旋转时的 UI 适配.
例子:sizeClass 可以做到一个 button ,在竖屏的时候,放在左上角,,而当横屏的时候,出现在右上角.
9.写出一个 update 语句,修改 User 表中 id 等于4的 UserName 值为张三
update User set UserName = '张三' where id = 4
insert into student(name, age) values ('Jonny',19)
create table if not exists student (id integer primary key,name text,age integer)
select * from student where name = 'maggie'
10.nil ,Nil,NULL,NSNULL
nil: 空的对象
Nil: 空的类
NULL: 指C 里面的变量(NSInteger ,CGFloat)
NSNULL: 空的集合
11.写出至少三个使用单例模式的系统类
NSUserDefault
NSFileManager
UIAPPlication
NSNotificationCenter
NSFileHandle
12.json 语法规则
json 是轻量级数据交换格式,写出 json 的例子甩他一脸
{} [] 都是对应的
{
"key" : "value"
"name":"zhang",
"age":19,
"lovers":[
"1号",
"2号",
"3号"
]
}
13.如何实现图文混排
1.webView 拼接 html 可以实现
2.iOS sdk中为我们提供了一套完善的文字排版开发组件:CoreText。CoreText库中提供了很多的工具来对文本进行操作,例如CTFont、CTLine、CTFrame等。利用这些工具可以对文字字体每一行每一段落进行操作。
14.自动登录的逻辑
当用户勾选了自动登录 ,每次到登录页面 ,去 UserDefault 中取得用户名和密码(加密过的),然后发送登录请求即可
15.应用间跳转用到的关键参数是什么
scheme myApp:// ?参数1= 1&参数2 =2 自定义协议
16.assign vs weak 和 __block vs __weak
assign 指的是基本变量 (NSINteger 或 CGFloat),
weak 指的是对象 ,调用 setter 方法时,,引用计数不加1
__block :block 可以访问局部变量,但不能修噶i,要是局部变量定义了__ block 就可以修改了.
__weak: 是弱引用,调用 setter 时,引用计数不加1.当 self 释放时. 在 block 中使用可以防止循环引用. __weak typeof (self) weakSelf = self;
17尽可能写出 NSObject 类包含的方法
description
alloc
dealloc
NSStringFromClass
NSSelectorFromString
responseToSelector
isKindOf
isMemberOf
18.iOS 单元测试框架有哪些
Xcode 自带的XCTest和第三方的GHUnit
19.CALayer 和 UIView 区别
UIView 是iOS 上 所有界面元素基类. 它本身是由 CoreAnimation实现的.而真正的绘图部分,是由 CALayer 的类来管理的. UIView 本身更像是一个 CALayer 的管理类,实现 UIView ,内部都是在访问CALayer的相关属性.
实现圆角
view.layer.cornerRadius = 17;
view.layer.borderWith = 10;
[view.layer maskToBounds]
20.沙盒的目录结构是怎么样的?用于什么场合?
1.bundle 容器(只读)
MyAPP.app
2.data 容器(可读可写)
1.Document :苹果建议键程序中创建或浏览的文件放在这里 ,iTunes 会同步
2.Library:( Library/cache ,Library/Preferences/xxx.plist)缓存文件,iTunes 不会同步
3.Tmp:创建和存放临时文件的地方,会删除。
21.多线程的几种方式
pThread,NSThread ,GCD NSOperation
pThread纯C 可以跨平台. 说明兼容性好, 缺点 对于某个平台 优化型不强
NSThread:
NSThread苹果早期的多线程技术- 已经被淘汰了
//最高度自定义化的 也是最难写的 一般不用 NSLock 会用到
GCD: 最流行写的
同步:同与主线程,在主线程上运行sync
异步:异于主线程,在非主线程上运行async
并行:多个任务同时进行,即多个任务在不同的线程运行concurrent
串行:多个任务在一个线程上排队运行,有序的serial
NSOperation 就是对GCD的一个封装OC 把C语法封装成了OC语法.额外的添加了5个特殊功能
任务的创建主要使用:NSBlockOperation
关于Operation 比GCD多的功能
1.可以限制最大的线程执行数—并发数
例如:可以同时下载5个文件:有10个文件, 开始下载5个,当第一个完成, 第6个会补充进来
2.暂停线程(已执行任务无效)
3.取消当前线程 (已执行任务无效)
5.取消某个任务的执行,
22.KVO and KVC ?有什么作用
kvo 键值观察模式,为一个属性添加观察,,当属性改变时,做出相应动作,,简化了编码
Key-Value Observing (KVO) 建立在 KVC 之上,它能够观察一个对象的 KVC key value 值的变化。
KVC 键值编码模式,,通过字符串访问对象的属性,做到 OC 做不到的事.
setValue for key 解析 json 时会用到 setValuesForKeyWithDictionary, 大大减少代码量
[persion valueForKeyPath:@"phone.battery" ]
[persion setValue:@"hufeng"forKey:@"name"];
23.同步请求和异步请求什么区别?
同步:都在主线程中执行.
异步:在分线程中执行,可以一起执行.
24.单例是什么 ?什么时候使用
在整个程序中只创建一次,只用同一块内存.
如何多个模块都要使用同一个变量,那这个变量可以升为单例.
如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间
static Person *p;
dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
p = [[Person alloc]init];
});
25.OC中创建线程的方法有哪些?如果想延时执行代码,方法是什么?
NSThread*thread = [[NSThreadalloc]initWithTarget:selfselector:@selector(startLongTimeWork:)object:nil];
//需要手动开启线程
[threadstart];
dispatch_queue_tqueue =dispatch_queue_create("AsyncConcurrent",DISPATCH_QUEUE_CONCURRENT);
//新式写法---使用block来创建操作/任务
NSBlockOperation*op3 = [NSBlockOperationblockOperationWithBlock:^{
[selfprintMinus];
}];
//如果想让代码在主队列里有序执行
[[NSOperationQueuemainQueue]addOperation:op3];
//让op3和op4在多线程(非主)中并行
NSOperationQueue*queue1 = [NSOperationQueuenew];
//[queue1 addOperation:op3];
延时:
1.self performSelector:() withObject:<> afterDelay:
2.[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
3.[NSThread sleepForTimeInterval:1.0f]; [self delayMethod];
4.GCD// when 时间 从现在开始经过多少纳秒
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0* NSEC_PER_SEC));
void(^task)() = ^ {
// 延迟操作执行的代码
NSLog(@"%@", [NSThread currentThread]);
};
// 经过多少纳秒,由主队列调度任务异步执行
dispatch_after(when, dispatch_get_main_queue(), task);
// 先执行就是异步,后执行就是同步
NSLog(@"come here");
26.OC 的类可以多重继承么?可以实现多个接口么?Category 是什么?重写一个类的方法用继承好还是分类好?为什么?
不能多继承 .
可以通过定义多个协议 实现多个接口
category 是分类 ,为已经存在的类添加额外的犯法,扩展是没有名字的分类.
分类只能扩充方法,一般情况下不能扩展属性和成员变量(用 runtime 机制可以在分类中添加属性).而扩展可以.扩展都是私有的..如果分类中声明了一个属性,那么分类只会生成这个属性的set、get方法声明,也就是不会有实现。
建议使用分类,,继承a is a b的关系,而分类只需要满足a has a b的关系,局限性小..
比较灵活,不用定义子类就能添加方法 ,仅对本 category 有效 ,不会影响其他类与原有类的关系,耦合度小.,
例子:继承 你需要调用子类 才能使用这个方法,,而分类 你直接可以用原类就能调用这个方法.简单了很多.
27.SDWebImage 原理 AFNetWorking 原理
SDWebImage:下载图片,现在 Document中创建一个文件,请求图片资源, 用 NSFileHandle 把接收到的 data 写入这个文件,,下载完毕后, 显示这个图片..在没下载完之前,可以显示 placeholder 中的图片:
AFNetWorking:封装了 请求网络的方法
实际上封装了NSURLSessionConfiguration . NSURLSession. NSURLSessionDataTask
NSURLSessionConfiguration*configuration = [NSURLSessionConfigurationdefaultSessionConfiguration];
//第三个参数为nil,默认就是子线程
NSURLSession *session = [NSURL SessionsessionWithConfiguration: configuration delegate: self delegateQueue: nil];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
[task resume];
28.app 的生命周期
1.willFinishLaunching 准备启动
2.didFinishLaunching 启动
3. didBecomeActive 活动状态
4.willResignActive 将要进入非活动状态
5.DidEnterBackground 进入后台
6.willEnterForeground 进入前台
7.willTerminate 将要退出
29.NSInteger 和 int 的区别
在64位系统操作上,NSInteger 是 C语言的long 类型, 在32位系统上,则是 int 类型.
30.runtime
运行时:直到运行时才确定类的类型.
动态的添加方法 和实力变量 .比如可以在 category 中通过运行时机制 添加属性.
31.国际化
project 找到 Localization ,点击+号,添加想要支持的语言.
通过新建 Strings文件. 键值对 ,同一个key 在不同语言的文件中值不一样.
调用 NSLocalizedStringFormTable 通过 key ,获得 ios 设备语言对应的字符.
32.实现线程同步?
@synthronized(){} 添加同步锁
NSLock
dispatch_async(dispatch_get_main_queue(),^{}) 异步主线程
NSOperationQueue :添加依赖,,,设置最大并发数为1.
累死我了 等我面完试,再壮大这个内容,,成为面霸!!!
职业发展:
因为我现在做的是iOS ,所以近几年 肯定是往移动开发这方面 发展的,,我打算在做 iOS 的同时 ,去自学 Android. 到时学好这两个 ,开发起来更方便...
过几年之后, 等我有一定代码量,,我觉得我会往架构师发展,, 因为我觉得架构是一个项目最重要的部分,,好的架构才能有好的项目.
碰到困难,放弃了怎么办 你怎么看:
我认为没有一项工作时没有困难的,,如果碰到困难,想尽一切办法解决它,我相信没有解决不了的困难,,只是看能不能坚持而已..
那些碰到困难就退缩的人是还没有准备好工作的...
兴趣没了 就放弃了 你怎么看:
我选择这个行业 ,我认为是一半为了兴趣,(因为我确实很喜欢苹果的东西),还有一半是为了生活...我相信没有百分之百的兴趣,工作中肯定会遇到很多困难让你觉得其实这个也不是想象的那么好玩 , 能坚持下来都是靠自己的意志 去解决一个又一个的困难的...