面试题分析.docx

上传人:b****8 文档编号:10031405 上传时间:2023-02-08 格式:DOCX 页数:13 大小:20.54KB
下载 相关 举报
面试题分析.docx_第1页
第1页 / 共13页
面试题分析.docx_第2页
第2页 / 共13页
面试题分析.docx_第3页
第3页 / 共13页
面试题分析.docx_第4页
第4页 / 共13页
面试题分析.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

面试题分析.docx

《面试题分析.docx》由会员分享,可在线阅读,更多相关《面试题分析.docx(13页珍藏版)》请在冰豆网上搜索。

面试题分析.docx

面试题分析

一.内存管理

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有几种种形式.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1