面试题分析.docx
- 文档编号:10031405
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:13
- 大小:20.54KB
面试题分析.docx
《面试题分析.docx》由会员分享,可在线阅读,更多相关《面试题分析.docx(13页珍藏版)》请在冰豆网上搜索。
面试题分析
一.内存管理
1.属性-属性关键字
MRC—>retaincopyassignnonatomic
ARC—>strongcopyweaknonatomic
含义—>
strong,retain,引用计数加一(对一块内存空间的强引用);
copy有的说法是另外开一个空间,内容复制,原来的空间引用计数不变,但是,实际的测试和retainstrong一样;
assign,weak用于代理模式(对一块内存空间的若引用--只是指向而已,不加一)或者是基本数据类型,如CGFloatNSUInteger等
nonatomic多线程访问不加锁,提高效率,通常的属性都用在主线程里面,所以,nonatomic经常使用
对OC对象而言,尽量使用属性,而不是成员变量,基本数据类型,有需要可以使用属性,否则成员变量即可,当然也成属性也没任何关系
2.release-->对象什么时候被release
此处的release应该指广义上的,即对象什么时候释放,当一个对象的引用计数为零的时候,就被释放了,比如MRC的时候,自己手动release一下,计数减1,手动autorelease对象或者类方法创建的对象会进入到最近的自动释放池,当释放池释放的时候,里面的对象引用计数减1,当计数为零的时候释放
3.delegate为什么是若引用weakassign
为了防止所有权循环,比如一个自定义的view的代理指针指向一个controller的时候,如果是强引用如retain,strong的话,此时controller的引用计数至少为2,航控制器保存一份,计数为1,自定义视图再保存一份,计数为2,当pop这个controller的时候,导航使controller的计数减1,但是,还为1,所以,controller不释放,view也不会释放,内存泄漏
4.releaseandautorelease
release使一个对象的引用计数马上减1,autorelease是延迟释放一个对象,行为是把这个对象放入到离它最近的自动释放池,当这个释放池被释放的时候,里面的所有对象引用计数减1,进入到自动释放池的情形如下
1.
-(NSArray*)getArr
{
NSArray*array=[[NSArrayalloc]init];
[arrayautorelease];
}
2.
self.m_arrData=[[[NSMutableArrayalloc]initWithCapacity:
0]autorelease];
3.
NSMutableArray*arr=[NSMutableArrayarray];
5.点语法属性
点语法或者叫属性,实际上使ios提供的getter方法和setting方法的简写形式,本质是方法
@property(nonatomic,retain)NSString*name;
-(NSString*)getName
{
return_name;
}
NSString*myName=self.name;
-(void)setName:
(NSString*)newName
{
[newNameretain];
[_namerelease];
_name=newName;
}
self.name=@"aaa";
跟引用计数相关的才如上面的setter方法,否则应该是这样的,getter方法不变,setter变化
@property(nonatomic,assign)NSIntegerage;
-(NSInteger)getAge
{
return_age;
}
-(void)setAge:
(NSInteger)newAge
{
_age=newAge;
}
6.自动释放池工作过程及说明在什么情况下需要Autoreleasepool
使用autoreleasepool的情形
每一个事件循环都会产生一个自动释放池,比如button的点击事件,当这个释放池,释放的时候,里面对象的引用计数减1;自动释放池是可以嵌套的,当自动释放池释放了,里面的所有对象引用计数都减1
-(void)poolLoop
{
NSAutoreleasePool*outPool=[[NSAutoreleasePoolalloc]init];
//对象1,2,3是outPool里面的对象
//对象1
//对象2
//对象3
NSAutoreleasePool*middlePool=[[NSAutoreleasePoolalloc]init];
//对象4,5,6是outPool里面的对象
//对象4
//对象5
//对象6
[middlePooldrain];
[outPooldrain];
}
//当outPool释放的时候,对象1,2,3引用计数减1,middlePool也会被释放,这样对象4,5,6引用计数减1,也就是自动释放池内部的所有对象引用计数都减少1
1.产生大量的临时对象的时候
-(void)runLoop
{
NSMutableArray*muArr=[[NSMutableArrayalloc]initWithCapacity:
0];
for(NSUIntegeri=0;i<50000;i++){
for(NSUIntegerj=0;j<50000;j++){
for(NSUIntegerk=0;k<50000;k++){
@autoreleasepool{
NSArray*subArr=[NSArrayarrayWithObjects:
@"one",nil];
[muArraddObject:
subArr];
}
}
}
}
}
-(void)createNextThread
{
[NSThreaddetachNewThreadSelector:
@selector(downLoadImage)toTarget:
selfwithObject:
nil];
}
//多线程入口,开启一个自动释放池
-(void)downLoadImage
{
@autoreleasepool{
}
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
[pooldrain];
//以上两种写法等效,上面的是ARC的写法,下面的是MRC的写法,但是,ARC\MRC两种方式都可以使用
@autoreleasepool{
//做事
}
}
7.自动释放池生命周期和需要手动创建的情形
生命周期,一个事件循环结束了,它的系统自动生成的释放池也就结束了,这个可以细化,XX一下,或者先这么说
8.代理的作用?
自定义类如何要求必须设置该类的代理?
要求编译时给出警告即可
代理的作用是类和类之间通信,传值(通信和传值本身一个意思)
协议方法设置为必选的即可,或者不加@required关键字,只要不是@optional关键字修饰的都是必选的
下面的除了ccc,都是必选择的
@protocolNumViewDelegate
-(void)aaa;
@required
-(void)bbb;
@optional
-(void)ccc;
@required
-(void)ddd;
@end
1:
ARC是什么?
工作机制详细讲下。
1.ARC是OC管理内存的一种方式,那它的本质和手动管理内存是一样的,都是采用引用计数的方式来管理一块内存空间的存在与否,只是帮我们写了release,autorelease,retain,ARC是编译器的特性,也就是说release,autorelease,retain是在编译的时候已经添加了,只有一些是动态的特性,比如代理指针,它会在程序运行时,动态判断具体指向哪一个类或者哪一块内存,性能方面ARC要比手动要高效,因为内部会有一些优化,ARC只对OC对象有效,如果是非OC对象且开了堆上的空间,那么需要你手动释放,或者是把它转化为OC对象,释放权利交给ARC。
2.ARC有一个特性就是归零若指针,比如model类拿到controller的指针,当controller被释放掉比如pop了之后,model这个类才调用它代理的协议方法,实际上这个时候,model的代理指针指向的controller已经被释放了,这个时候ARC要做的就是把model的代理指针置为nil,防止野指针的情况发生
二、controller生命周期
//最开始运行时
2014-08-1812:
05:
04.482ControllerLife[20552:
60b]initinroot
2014-08-1812:
05:
04.495ControllerLife[20552:
60b]loadViewinroot
2014-08-1812:
05:
04.496ControllerLife[20552:
60b]viewDidLoadinroot
2014-08-1812:
05:
04.500ControllerLife[20552:
60b]viewWillAppearinroot
2014-08-1812:
05:
04.698ControllerLife[20552:
60b]viewDidAppearinroot
//push出来别的页面之后
2014-08-1812:
05:
06.539ControllerLife[20552:
60b]viewWillDisappearinroot
2014-08-1812:
05:
07.075ControllerLife[20552:
60b]viewDidDisappearinroot
//返回到原来的页面之后
2014-08-1812:
05:
24.092ControllerLife[20552:
60b]viewWillAppearinroot
2014-08-1812:
05:
24.602ControllerLife[20552:
60b]viewDidAppearinroot
视图控制器可以理解为两部分,一是视图控制器本身,二是视图控制器的self.view
init:
初始化视图控制器本身,跟self.view没有一毛钱关系
loadView:
初始化控制器的self.view,通常不需要覆写这个方法了,用系统的即可
viewDidLoad:
loadView方法执行完了之后,自动调用
当窗口要求某个控制器展示其视图的时候,
*****即展示其self.view的时候并且self.view为nil的时候*****
loadView被调用,viewDidLoad被调用,这就是为什么viewDidLoad通常只调用一次的原因
因为self.view有了的话,loadView和viewDidLoad不被调用
-(void)didReceiveMemoryWarning
{
//内存警告处理,不是放控制器本身
//为了让处理了也不至于影响我们的应用,也就是要重新跑一次loadView和viewDidLoad方法,那么综上,我们要把self.view=nil;
//两个条件都满足即窗口要求其展示self.view&&self.view==nil的时候,loadView和viewDidLoad方法会被重新调用
//判断条件1
//如果某个controller的self.view没有被加载到内存中那么,这个内存警告处理就不需要做了
//判断条件2
//某个controller的self.view不在窗口上,才可以释放
//self.isViewLoaded条件1,self.view已经被加载
//self.view.window==nil条件2,不在窗口上
if(self.isViewLoaded&&self.view.window==nil){
}
[superdidReceiveMemoryWarning];
//Disposeofanyresourcesthatcanberecreated.
if(self.isViewLoaded&&self.view.window==nil){
//作用重新执行loadView和viewDidLoad
self.view=nil;
//释放资源
self.m_view=nil;
self.m_name=nil;
m_arr=nil;
}
}
viewWillDisappear
viewDidDisappear
viewWillAppear
viewDidAppear
这四个都是切换界面的时候,自动调用的方法
三、实用工具
1.版本控制
2.内存检测工具
3.上传,企业级如何发布,不经过appstore可以吗
四、网络相关
1.post,get请求方式
2.同步http请求,NSURLConnectionGCD
3.同步请求和异步请求区别
4.xmljson怎么用
五、第三方库
六、设计模式
1.DelegateNotificationKVC_KVOMVC
2.delegate用法,写法,作用
3.notificationandKVC_KVO区别联系
4.delegate和blocks优缺点
5.block的作用:
一般用于回调.不用block可以使用delegate实现
6.观察者模式
七、好的编程风格
1.自定义试图复用
2.自定义控件
3.自定义model类
4.自定义table步骤
八、项目遇到问题
1.内存不善,崩贵
2.bug比较多
3.引入新的第三方库,未知的东西引入到工程里
九、iOS系统xi特性和新控件
十、基本语法
1.是否有多继承
2.私有方法,变量
3.SEL和@selector
4.id类型
5.一个类的基本骨架
6.类别(category)是什么
7.xib和nib文件的区别
8.[UIImageimageNamed:
aa.png];优缺点
9.OC的优缺点
10.OC消息实现的具体过程
11.arc 中unsafe_unretained 是作用。
一个@property (strong) NSString *string1 默认是什么操作。
十一、多线程
1.进程和线程区别和联系
2.ios线程常用方式,线程安全
3.多线程怎么写,如何刷新UI
4.阐述堆和栈的区别
5、在多线程中,下面代码有什么问题 怎么改 i nterface a:
NSobject { NSmutableArray *array; } .... @im.... -(void)add:
(*item item){ [array addObject :
item]; } -(void)rem:
(*item item){ [array removeobject:
item]; }
十二、数据存储
1.数据库如何
十三、iOS运行机制深层次
1.touch和非touch事件发生时系统中的传递过程
2.动态绑定
十四、基本控件
1.如何实现动态表格
杂七杂八
1.某app里面打开别的app,进程之间通信,传递数据
2.const、volatile、static、const*
3.#import#include@class
4.堆栈
5.oc的反射机制
6.沙河目录周期作用
7.后台
通知的优点:
是任何两个类都可以相互发送通知接收通知,也可以一对多;
缺点是占用系统资源比较大。
通知可以用单例(类似于自己写的通知中心)、代理、KVO代替
通知是同步的。
如果是异步才会返回主线程,刷新UI
1.NotificationCenter会保存注册了通知的类或者是对象(引用计数+1),既然这个类或者对象存在的话,引用计数至少为1,如果注册了通知中心,改对象的引用计数至少为2,即使这个类被pop(UIViewController)或者是被从(UIView)页面上移除,或者(继承于NSObject)的类,即使这样的话,只是使改类或者对象的引用计数减,综上,此时该对象的引用计数至少为1,那么就有内存泄漏了,如果在该类的dealloc里面移除,引用计数归零,没有内存泄漏
2.
category和extension的区别
3.对id的理解
12.NSOpertaion有几种种形式.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 试题 分析