史上最全的iOS面试题及答案
- 格式:doc
- 大小:14.82 KB
- 文档页数:5
1、写出方法获取iOS内存使用情况。
〃获取当前设备可用内存及所占内存的头文件#import<sys/sysctl.h>#import<mach/mach.h>〃获取当前设备可用内存(单位:MB)-(double)availableMemory{vm_statistics_data_tvmStats; mach_msg_type_number_tinfoCount =HOST_V M」N FO_COUNT; kern_return_tkernRetur n =host_statistics(mach_host_self(),HOST_VM_INFO, (host_i nfo_t)&vmStats,& nfoCount);if (kernReturn != KERN_SUCCESS) {returnNSNotFound;}return ((vm_page_size *vmStats.free_count) / 1024.0) / 1024.0;} ~〃获取当前任务所占用的内存(单位:MB)-(double)usedMemory{task basic info data ttasklnfo;mach_msg_type_number_tinfoCount =TASK_BASIC_INFO_COUNT;kern_retum_tkernRetum = task_info(mach_task_self(), TASK_BASIC_INFO,(task_info_t)&tasklnfo,& infoCount);if (kernReturn != KERN_SUCCESS ){returnNSNotFound;}returntasklnfo.resident_size / 1024.0 / 1024.0;}1、深拷贝和浅拷贝的理解?深拷贝拷贝的是内容,浅拷贝拷贝的是指针。
史上最全的iOS面试题及答案1. 1.写一个NSString类的实现+ (id)initWithCString:(c*****t char *)nullTerminatedCStringencoding:(NSStringEncoding)encoding;+ (id) stringWithCString: (c*****t char*)nullTerminatedCStringencoding: (NSStringEncoding)encoding{NSString *obj;obj = [self allocWithZone: NSDefaultMallocZone()];obj = [obj initWithCString: nullTerminatedCString encoding: encoding];return AUTORELEASE(obj);}2static 关键字的作用:(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。
3线程与进程的区别和联系?进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
程和线程的主要差别在于它们是不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
IOS面试题1.在一个对象的方法里面:=“object”;和name=”object”有什么不同吗?答:=”object”:会调用对象的setName()方法;name=“object”:会直接把object赋值给当前对象的name属性。
2.请简述=nil的机制,以及与[namerelease]的区别?=nil;//使用nil参数调用setName:方法[name release]生成的访问器将自动释放以前的name对象3.请简要说明viewDidLoad和viewDidUnload何时调用答viewDidLoad在view从nib文件初始化时调用,loadView在controller 的view为nil时调用。
此方法在编程实现view时调用,view控制器默认会注册memory warning notification,当view controller的任何view没有用的时候,viewDidUnload会被调用,在这里实现将retain的view release,如果是retain的IBOutlet view属性则不要在这里release,IBOutlet会负责release。
4.打印结果main(){int a[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf(“%d,%d”,*(a+1),*(ptr-1));}答:*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)int*ptr=(int*)(&a+1);则ptr实际是&(a[5]),也就是a+5原因如下:&a是数组指针,其类型为int(*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。
a是长度为5的int数组指针,所以要加5*sizeof(int)所以ptr实际是a[5]但是prt与(&a+1)类型是不一样的(这点很重要)所以prt-1只会减去sizeof(int*)a,&a的地址是一样的,但意思不一样a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].5.简述内存分区情况提示:分为代码区、数据区、堆区、栈区(1)代码区:存放函数二进制代码(2)数据区:系统运行时申请内存并初始化,系统退出时由系统释放。
iOS基础问答面试题1.When to use NSMutableArray and when to use NSArray?什么时候使用NSMutableArray,什么时候使用NSArray?答案:当数组在程序运行时,需要不断变化的,使用NSMutableArray,当数组在初始化后,便不再改变的,使用NSArray。
需要指出的是,使用NSArray 只表明的是该数组在运行时不发生改变,即不能往NSAarry的数组里新增和删除元素,但不表明其数组內的元素的内容不能发生改变。
NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArray需要注意。
2.Give us e某ample of what are delegate methods and what are data source methods of uitableview.给出委托方法的实例,并且说出UITableVIew的Data Source方法答案:CocoaTouch框架中用到了大量委托,其中UITableViewDelegate就是委托机制的典型应用,是一个典型的使用委托来实现适配器模式,其中UITableViewDelegate协议是目标,tableview是适配器,实现UITableViewDelegate协议,并将自身设置为talbeview的delegate的对象,是被适配器,一般情况下该对象是UITableViewController。
UITableVIew的Data Source方法有-(NSInteger)tableView:(UITableView 某)tableView numberOfRowsInSection:(NSInteger)section;- (UITableViewCell 某)tableView:(UITableView 某)tableView cellForRowAtInde某Path:(NSInde某Path 某)inde某Path;3.How many autorelease you can create in your application? Is there any limit?在应用中可以创建多少autorelease对象,是否有限制?答案:无4.If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?如果我们不创建内存池,是否有内存池提供给我们?答案:界面线程维护着自己的内存池,用户自己创建的数据线程,则需要创建该线程的内存池5.When you will create an autorelease pool in your application?什么时候需要在程序中创建内存池?答案:用户自己创建的数据线程,则需要创建该线程的'内存池6.When retain count increase?什么时候内存计数会增加?答案:见iOS面试题(一)7.What are commonly used NSObject class methods?类NSObject的那些方法经常被使用?答案:NSObject是Objetive-C的基类,其由NSObject类及一系列协议构成。
iOS⾯试题集锦(附答案)(个⼈精⼼整理)1、第三⽅库、masonry第三⽅⾃动布局是否⽤过,类⽅法和对象⽅法的区别2、MVC机制C对M:APIC对V:OutletV对C:T arget-action,Delegate,DatasourceM对C:Notification,KVO3、runtime机制runtime是⼀套⽐较底层的纯C语⾔API, 属于1个C语⾔库, 包含了很多底层的C语⾔API。
runtime ⽤来⼲什么呢??⽤在那些地⽅呢?怎么⽤呢?runtime是属于OC的底层, 可以进⾏⼀些⾮常底层的操作(⽤OC是⽆法现实的, 不好实现)在程序运⾏过程中, 动态创建⼀个类(⽐如KVO的底层实现)在程序运⾏过程中, 动态地为某个类添加属性\⽅法, 修改属性值\⽅法遍历⼀个类的所有成员变量(属性)\所有⽅法例如:我们需要对⼀个类的属性进⾏归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使⽤了runtime就可以动态设置!1>头⽂件利⽤头⽂件,我们可以查看到runtime中的各个⽅法!2>相关应⽤NSCoding(归档和解档, 利⽤runtime遍历模型对象的所有属性)字典–>模型(利⽤runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)KVO(利⽤runtime动态产⽣⼀个类)⽤于封装框架(想怎么改就怎么改)这就是我们runtime机制的只要运⽤⽅向3>相关函数objc_msgSend : 给对象发送消息class_copyMethodList : 遍历某个类所有的⽅法class_copyIvarList : 遍历某个类所有的成员变量class_…..这是我们学习runtime必须知道的函数!4.必备常识1> Ivar : 成员变量2> Method : 成员⽅法从上⾯例⼦中我们看到我们定义的成员变量,如果要是动态创建⽅法,可以使⽤Method,4、strong ,weak, assign有什么区别assign:简单赋值,不更改索引计数(Reference Counting)。
史上最全的iOS面试题及答案以下是为大家整理的史上最全的ios面试题及答案的相关范文,本文关键词为史上,最全,ios,试题,答案,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教师教学中查看更多范文。
精品文档.史上最全的ios面试题及答案?1.写一个nsstring类的实现+(id)initwithcstring:(c*****tchar*)nullTerminatedcstringencoding:(nsstringencoding)encoding;+(id)stringwithcstring:(c*****tchar*)nullTerminatedcstringencoding:(nsstringencoding)encoding{nsstring*obj;obj=[selfallocwithZone:nsDefaultmallocZone()];obj=[objinitwithcstring:n ullTerminatedcstringencoding:encoding];returnAuToReLeAse(obj);}2static关键字的作用:(1)函数体内static变量的作用范围为该函数体,不同于auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
3线程与进程的区别和联系?精品文档进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
iOS⾯试题总结(持续更新)过段时间打算跳槽,找了⼀些⾯试题来做,在这⾥做个总结⽅便review,希望能对要⾯试的童鞋有帮助。
以下为⾯试题:1. 运⾏以下代码会有什么结果NSString *str1 = @"str1";NSString *str2 = [NSString stringWithFormat:@"str1"];NSString *str3 = @"str1";NSLog(@"str1 == str2 --- %d", str1 == str2);NSLog(@"str1 == str3 --- %d", str1 == str3);NSLog(@"str1 isEqualToString str2 --- %d", [str1 isEqualToString:str2]);NSLog(@"str1 isEqualToString str3 --- %d", [str1 isEqualToString:str3]); 第⼀眼看这道题,只能确定使⽤isEqualToString:来⽐较字符串是⽐较每⼀个字符,所以isEqualToString肯定是true,⽽在OC⾥使⽤==号⽤于判断是否指向同⼀个地址,那么问题就来了,使⽤字⾯量创建的字符串与调⽤⽅法创建的有什么区别呢? 实践出真知,⽼⽼实实敲代码,打上断点来⼀探究竟 可以看到使⽤字⾯量创建的字符串为常量字符串,⽽⽤⽅法创建的则是指针字符串。
常量字符串会在app销毁后释放,在app存在期间会⼀直存在,且相同的常量字符串都指向同⼀个地址。
运⾏结果就如下了 2. 以下⽅式创建的timer有什么区别[NSTimer scheduledTimerWithTimeInterval:1.f repeats:YES block:^(NSTimer * _Nonnull timer) {//创建⼀个timer并且在当前的runloop中执⾏。
iOS面试题1、IOS中的传值方式有那些?答案:属性传值、单例传值,通知传值、全局变量、代理传值,block传值2. obj-c的优缺点答: objc优点:1) Cateogies (类目)2) Posing (冒充)3) 动态识别4) 指标计算5)弹性讯息传递6) 不是一个过度复杂的 C 衍生语言7) Objective-C 与 C++ 可混合编程objc缺点:1) 不支援命名空間2) 不支持运算符重载3)不支持多重继承4)使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。
(如内联函数等),性能低劣。
3. readwrite,re ado nly,assign,retain,copy,nonatomic 属性的作用?答:@property是一个属性访问声明,扩号内支持以下几个属性:1,getter=getterName,setter=setterName,设置setter与 getter的方法名2,readwrite,re ado nly,设置可供访问级别2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再 Copy出新的对象,retainCount为1。
这是为了减少对上下文的依赖而引入的机制。
4.获取应用程序程序包中资源文件路径的方法:例如获取程序包中一个图片资源(apple.png)路径的方法:答: NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];UIImage *appleImage = [[UIImage alloc]initWithContentsOfFile:imagePath];代码中的mainBundle类方法用于返回一个代表应用程序包的对象。
面试题1.Object-c的类可以多继承么?category是什么?重写一个类的方式用继承好还是分类好?为什么?答:Object-c的类不可以多重继承,可以用伪继承和@protocol委托来代替;可以实现多个接口,通过实现多个接口就可以完成C++的多重继承,Category 是类别,一般用分类比较好,用Category去重写类的方法,仅对本Category 有效,不会影响到其他类与原有类的关系。
伪继承必须覆盖两个方法,即methodSignatureForSelector: 和forwardInvocation:。
methodSignatureForSelector:的作用在于为另一个类实现的消息创建一个有效的方法签名。
forwardInvocation:将选择器转发给一个真正实现了该消息的对象.2.类别的作用?继承和类别在实现中有何区别?答:category可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
继承可以增加,修改或者删除方法,并且可以增加属性。
/* 非正式协议:是使用类别category来实现,非正式协议是NSObject的一个类别,这样任何类的对象都可以作为委托对象来使用,它可以列出对象能够执行的所有方法,这样用来实现委托,我们可以使用选择器来判断该非正式协议中是否有这个方法。
正式协议:是一个命名的方法列表,与非正式协议相比不同的是,它要求显示的采用协议,采用协议的方法是在类的@interface声明中列出协议的名称,此时,实现协议的类应该遵守协议,承诺实现协议中的所有方法。
*/3.类别和类扩展的区别?答:1."类别"比"子类"方便多了,因为对已添加category的类,使用到它或者它的子类的地方,category都会起作用;“子类”的话,则需要在使用的每个地方,创建子类对象2."类别"只能添加方法,不能加属性、变量3."类别"一般是对框架提供类的扩展(没有源码,不能修改)4."类别"一般是在不想生成一个新的子类的情况下,比如对NSArray的扩展“扩展”则相当于定义一个子类,在里面添加属性和方法4.属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在哪种情况下用?什么情况使用weak关键字,相比assign有什么不同?答:1> readwrite:同时生成get方法和set方法的声明和实现2> readonly:只生成get方法的声明和实现3> assign:set方法的实现是直接赋值,用于基本数据类型4> retain:set方法的实现是release旧值,retain新值,用于OC对象类型5> copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型6> nonatomic:非原子性,set方法的实现不加锁(比atomic性能高)注意点:(nonatomic)非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。
ios面试题及答案2020简书我是 ios,来了一次面试题,题目很简单,主要考察的是“怎么与人沟通”。
下面是我的面试试题,一套5题(不带计算器)。
问的是你和朋友一起玩手机吧?怎么做到有联系呀?面试问题:用哪种输入法?为什么要用 macOS?一、这是你的手机号,输入法你用什么我们知道,用手机聊天,是不会用输入法的。
所以,只要是用的我们熟悉的输入法,就会跟你用一样的。
例如:我要给你发短信,用输入法里默认的输入法!只要打开“发送”栏就会弹出你想发的短信;我要发微信呀!还有一个,“在 QQ里”里面是比较常用的输入法……二、你说我用的是 pro max,你和朋友是如何做到有联系的,这是什么原因吗答案:1)手机作为一种媒介,要让人们对你有更好的印象,还是需要有一个相对统一的形象来进行描述。
2)语言可以帮助我们建立关系。
3)沟通就是语言的一种传递方式,所以我们通过文字的输入来给对方传递信息。
4)如果没有沟通,我们的交流就是无意义的,所以需要有情感色彩(如喜悦、感动、激动等)。
三、我问你用什么输入法,你是怎么知道朋友在用哪个手机号的,怎么回复他的,这个问题不能问到具体的内容,但是我感觉我问的是这个。
怎么知道我的手机号呢?比如我给朋友发了条信息,他打开手机输入了这个号码(例如####等等),我就知道他在用哪个手机号了。
这个方法效率很高,不会像问问题一样,你一上来就告诉他这些事情(例如#################’等)。
而且会给你足够多的信息去选择一个合适的方法,这样才能让他主动来问你,而且问出去也更有针对性。
我觉得很多人不愿意用输入法吧,因为它的效率太低了(至少需要十几秒才能读完一个字),而且这很可能会让事情变得更复杂和麻烦。
四、我和朋友是怎么建立关系的,你会经常和别人聊天吗会,我对我的朋友很好,我也是个特别热情的人,尤其在刚开始和别人聊天时很开心。
和别人聊天,最好是用微信这个工具。
因为微信跟朋友们保持很近的距离,能让他们知道你是一个人。
史上最全的iOS面试题及答案
史上最全的iOS面试题及答案iOS面试小贴士———————————————回答好下面的足够了
-------------------------------------多线程、特别是NSOperation 和GCD 的内部原理。
运行时机制的原理和运用场景。
SDWebImage的原理。
实现机制。
如何解决TableView卡的问题。
block和代理的,通知的区别。
block的用法需要注意些什么。
strong,weak,retain,assign,copy nomatic 等的区别。
设计模式,mvc,单利,工厂,代理等的应用场景。
单利的写法。
在单利中创建数组应该注意些什么。
NSString 的时候用copy和strong的区别。
响应值链。
NSTimer 在子线程中应该手动创建NSRunLoop ,否则不能循环执行。
UIScrollView和NSTimer组合做循环广告图轮播的时候有一个属性可以控制当上下滚动tableview的时候广告轮播图依然正常滚动。
Xcode最新的自动布局。
这个很多公司都用。
尽量自学下。
git ,和svn的用法。
git的几个命令简单的记下。
友盟报错可以查到具体某一行的错误,原理是什么。
Instrument 可以检测电池的耗电量、和内存的消耗。
的用法。
动画CABaseAnimation CAKeyAni…. CATrans….. CAGoup…. 等熟悉。
ARC的原理。
自己写过什么自定义控件就最好了。
———————————————回答好上面的足够了
------------------------------------- __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
tableView 滑动卡的问题主要是因为:从缓存中或者是从本地读取图片给UIImage的时候耗费的时间。
需要把下面的两句话放到子线程里面:NSData *imgData = [NSData dataWithContentsOfURL:[NSURL
URLWithString:app.icon]]; //得到图像数据
UIImage *image = [UIImage imageWithData:imgData];
把UIImage赋值给图片的时候在主线程。
子线程不能更新UI 所有的UI跟新都是主线程执行了。
手指滑动屏幕了。
或者屏幕的某个方法执行了。
子线程里面加入NSTimer 的时候需要手动添加NSRunloop 否则不能循环。
单利里面添加NSMutableArray 的时候,防止多个地方对它同时便利和修改的话,需要加原子属性。
并且用strong,,,并且写一个遍历和修改的方法。
加上锁。
Lock UnLock
__weak ViewController* weakSelf = self;GCD里面用
__weak 防止内存释放不了,循环引用。
二、
SDWebImage内部实现过程入口
setImageWithURL:placeholderImage:options: 会先把placeholderImage 显示,然后SDWebImageManager 根据URL 开始处理图片。
进入
SDWebImageManager-downloadWithURL:delegate:option s:userInfo:,交给SDImageCache 从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo:.先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调
imageCache:didFindImage:forKey:userInfo: 到SDWebImageManager。
SDWebImageManagerDelegate 回调webImageManager:didFinishWithImage: 到UIImageView+WebCache 等前端展示图片。
如果内存缓存中没有,生成NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。
根据URLKey 在硬盘缓存目录下尝试读取图片文件。
这一步是在NSOperation 进行的操作,所以回主线程进行结果回调notifyDelegate:。
如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。
SDImageCacheDelegate 回调
imageCache:didFindImage:forKey:userInfo:。
进而回调展示图片。
如果从硬盘缓存目录读取不到图片,说明所有缓存都
不存在该图片,需要下载图片,回调
imageCache:didNotFindImageForKey:userInfo:。
共享或重新生成一个下载器SDWebImageDownloader 开始下载图片。
图片下载由NSURLConnection 来做,实现相关delegate 来判断图片下载中、下载完成和下载失败。
connection:didReceiveData: 中利用ImageIO 做了按图片下载进度加载效果。
connectionDidFinishLoading: 数据下载完成后交给SDWebImageDecoder 做图片解码处理。
图片解码处理在一个NSOperationQueue 完成,不会拖慢主线程UI。
如果有需要对下载的图片进行二次处理,最好也在
这里完成,效率会好很多。
在主线程notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给SDWebImageDownloader。
imageDownloader:didFinishWithImage: 回调给SDWebImageManager 告知图片下载完成。
通知所有的downloadDelegates 下载完成,回调给需要的地方展示图片。
将图片保存到SDImageCache 中,内存缓存和硬盘缓存同时保存。
写文件到硬盘也在以单独NSInvocationOperation 完成,避免拖慢主线程。
SDImageCache 在初始化的时候
会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
SDWI 也提供
了UIButton+WebCache 和
MKAnnotationView+WebCache,方便使用。
SDWebImagePrefetcher 可以预先下载图片,方便后续使用。
从上面流程可以看出,当你调用setImageWithURL:方法的
时候,他会自动去给你干这么多事,当你需要在某一具体时刻做事情的时候,你可以覆盖这些方法。
比如在下载某个图片的过程中要响应一个事件,就覆盖这个方法:1234567891011//覆盖方法,指哪打哪,这个方法是下载imagePath2的时候响应SDWebImageManager
*manager = [SDWebImageManager sharedManager]; [manager downloadImageWithURL:imagePath2
options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize)
{ NSLog(@'显示当前进度
'); } completed:^(UIImage *image, NSError
*error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { NSLog(@'下载完成'); }];。