IOS Dev Intro - IOS Interview QAs

来源:互联网 发布:什么是网络在线客服 编辑:程序博客网 时间:2024/05/16 13:06


http://blog.csdn.net/potato512/article/details/51454965


1、简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用? 
管理机制:使用了一种叫做引用计数的机制来管理内存中的对象。
OC中每个对象都对应着他们自己的引用计数,引用计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息 时,持有计数数值会增加1。相反,当你像一个对象发送release消息时,持有计数数值会减小1。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。
retain(引用计数加1)->release(引用计数减1)
alloc(申请内存空间)->dealloc(释放内存空间)
readwrite: 表示既有getter,也有setter   (默认)
readonly: 表示只有getter,没有setter
nonatomic:不考虑线程安全
atomic:线程操作安全(默认)
线程安全情况下的setter和getter:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. - (NSString *) value    
  2. {       
  3.    @synchronized(self) {           
  4.       return [[_value retain] autorelease];       
  5.    }  
  6. }   
  7.   
  8.   
  9. - (void)setValue:(NSString *)aValue   
  10. {       
  11.    @synchronized(self) {           
  12.     [aValue retain];           
  13.     [_value release];           
  14.     _value = aValue;       
  15.    }  
  16. }  

retain: release旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
assign: 简单赋值,不更改索引计数(默认)
copy: 其实是建立了一个相同的对象,地址不同(retain:指针拷贝  copy:内容拷贝)
strong:(ARC下的)和(MRC)retain一样(默认)
weak:(ARC下的)和(MRC)assign一样, weak当指向的内存释放掉后自动nil化,防止野指针
unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。


2、类变量的@protected ,@private,@public,@package,声明各有什么含义?
@private:作用范围只能在自身类
@protected:作用范围在自身类和继承自己的子类(默认)
@public:作用范围最大,可以在任何地方被访问。
@package:这个类型最常用于框架类的实例变量,同一包内能用,跨包就不能访问


3、线程是什么?进程是什么?二者有什么区别和联系? 
一个程序至少有一个进程,一个进程至少有一个线程:
进程:一个程序的一次运行,在执行过程中拥有独立的内存单元,而多个线程共享一块内存
线程:线程是指进程内的一个执行单元。
联系:线程是进程的基本组成单位
区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
举例说明:操作系统有多个软件在运行(QQ、office、音乐等),这些都是一个个进程,而每个进程里又有好多线程(比如QQ,你可以同时聊天,发送文件等)


4、谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
好处:
(1)使用线程可以把占据时间长的程序中的任务放到后台去处理
(2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
(3)程序的运行速度可能加快
(4)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。
缺点:
(1)如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
(2)更多的线程需要更多的内存空间。
(3)线程的中止需要考虑其对程序运行的影响。
(4)通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
实现多线程的方法:
NSObject类方法
NSThread
NSOperation
GCD


5、线程同步和异步的区别?IOS中如何实现多线程的同步?
异步:举个简单的例子 就是游戏,游戏会有图像和背景音乐
同步:是指一个线程要等待上一个线程执行完之后才开始执行当前的线程,上厕所
NSOperationQueue:maxcurrentcount
NSConditionLock
GCD->http://blog.csdn.net/onlyou930/article/details/8225906


6、假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. NSMutableString * str = [[NSMutableString alloc]initWithFormat;@“aabcad”];  
  2. for (int i = 0 ,i < str.length - 1 ;i++)  
  3. {  
  4.     unsigned char a = [str characterAtIndex:i];  
  5.     for (int j = i + 1 ,j < str.length ,j++)  
  6.     {  
  7.         unsigned char b = [str characterAtIndex:j];  
  8.         if (a == b )  
  9.      {  
  10.             if (j == i + 1)  
  11.          {  
  12.                   
  13.          }  
  14.          else  
  15.          {  
  16.                 [str deleteCharactersInRange:NSMakeRange(j, 1)];  
  17.             }  
  18.         }  
  19.    }  
  20. }  
  21. NSLog(@“%@”,str);  

7、获取一台设备唯一标识的方法有哪些?
(1)UDID
UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成。
(2)UUID
UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码.
(3)MAC Address
(4)OPEN UDID
(5)广告标识符
(6)Vindor标示符
Vendor是CFBundleIdentifier(反转DNS格式)的前两部分。来自同一个运营商的应用运行在同一个设备上,此属性的值是相同的;不同的运营商应用运行在同一个设备上值不同。
经测试,只要设备上有一个tencent的app,重新安装后的identifierForVendor值不变,如果tencent的app全部删除,重新安装后的identifierForVendor值改变。
*ios7以后使用keychain 
  
8、iOS类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。
不可以多继承,用protocol实现


9、堆和栈的区别?
堆需要用户手动释放内存,而栈则是编译器自动释放内存
问题扩展:要知道OC中NSString的内存存储方式


10、iOS本地数据存储都有哪几种方式?
NSKeyedArchiver    
NSUserDefaults
Write写入方式(plist文件、txt文件等)
SQLite3
CoreData
(问题扩展:什么情况下使用什么样的数据存储)
(1)NSKeyedArchiver:采用归档的形式来保存数据,数据对象需要遵守NSCoding协议,对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。缺点:只能一次性归档保存以及一次性解压。所以只能针对小量数据,对数据操作比较笨拙,如果想改动数据的某一小部分,需要解压或归档整个数据。
(2)NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。缺点:如果要存储其他类型,需要转换为前面的类型,才能用NSUserDefaults存储。
(3)Write写入方式:永久保存在磁盘中。第一步:获得文件即将保存的路径:第二步:生成在该路径下的文件:第三步:往文件中写入数据:最后:从文件中读出数据:
(4)SQLite:采用SQLite数据库来存储数据。SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。
(5)CoreData:系统自带的数据库存储。


11、写出方法获取iOS内存使用情况。
(问题扩展:如何利用Xcode观察内存使用情况)
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. // 获取当前设备可用内存及所占内存的头文件  
  2. #import <sys/sysctl.h>  
  3. #import <mach/mach.h>  
  4.   
  5. // 获取当前设备可用内存(单位:MB)  
  6. - (double)availableMemory  
  7. {  
  8.   vm_statistics_data_t vmStats;  
  9.   mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;  
  10.   kern_return_t kernReturn = host_statistics(mach_host_self(),   
  11.                                              HOST_VM_INFO,   
  12.                                              (host_info_t)&vmStats,   
  13.                                              &infoCount);  
  14.     
  15.   if (kernReturn != KERN_SUCCESS)   
  16.   {  
  17.     return NSNotFound;  
  18.   }  
  19.     
  20.   return ((vm_page_size *vmStats.free_count) / 1024.0) / 1024.0;  
  21. }  
  22.   
  23.   
  24. // 获取当前任务所占用的内存(单位:MB)  
  25. - (double)usedMemory  
  26. {  
  27.   task_basic_info_data_t taskInfo;  
  28.   mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;  
  29.   kern_return_t kernReturn = task_info(mach_task_self(),   
  30.                                        TASK_BASIC_INFO,   
  31.                                        (task_info_t)&taskInfo,   
  32.                                        &infoCount);  
  33.   
  34.   
  35.   if (kernReturn != KERN_SUCCESS)   
  36.   {  
  37.     return NSNotFound;  
  38.   }  
  39.     
  40.   return (taskInfo.resident_size / 1024.0 / 1024.0);  
  41. }  


12、深拷贝和浅拷贝的理解?
对实例进行深拷贝时当前类需要实现NSCopying协议。
浅拷贝是复制出来一个跟原对象相同地址的对象
深拷贝时复制一个跟源对象不同地址的对象 改变源对象对新对象没有影响


13.怎样实现一个singleton的类。
问题扩展:单例的好处是什么?——节省内存 
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. + (AccountManager *)sharedManager    
  2. {    
  3.         static AccountManager *staticInstance = nil;    
  4.         static dispatch_once_t predicate;    
  5.         dispatch_once(&predicate, ^{    
  6.                 staticInstance = [[self alloc] init];     
  7.         });    
  8.     return staticInstance;    
  9. }    


14、什么是安全释放?
置nil 再释放


15、RunLoop是什么?
Run loops 是线程相关的的基础框架的一部分。
一个 run loop 就是一个事件处理 的循环,用来不停的调度工作以及处理输入事件。
使用 run loop的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。
Runloop还可以在loop在循环中的同时响应其他输入源,比如界面控件的按钮,手势等。


16、什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储?
序列化是把对象转化成字节序列的过程  反序列化是把字节序列恢复成对象
将对象写到文件或者数据库里,并且能读取出来
遵循NSCoding协议 实现复杂对象的存储 实现该协议后可以对其进行打包或解包,转化成NSData


17、写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?
#define MIN(X,Y)  ((X)>(Y)?(Y):(X))
扩展:在定义宏的时候需要注意哪些问题?
宏全部大写 写在#import 下 @interface上  结尾无分号


18、iphone os有没有垃圾回收机制?简单阐述一下OC内存管理。
iphone os没有垃圾回收机制  oc的内存管理是谁创建谁释放  程序中遇到retain 该对象引用计数+1 遇release该对象引用计数-1 retainCount为0时 内存释放


19、简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. // 进入后台时  
  2. -(void)applicationWillResignActive:(UIApplication *)application;  
  3. -(void)applicationDidEnterBackground:(UIApplication *)application;  
  4. // 进入前台时  
  5. -(void)applicationDidEnterForeground:(UIApplication *)application;  
  6. -(void)applicationWillResignActive:(UIApplication *)application;  

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. // 各个程序运行状态时代理的回调:  
  2. // 当进程启动但还没进入状态保存  
  3. - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  4. 当进程启动基本完成程序准备开始运行  
  5. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  6. // 当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了  
  7. - (void)applicationWillResignActive:(UIApplication *)application  
  8. 当应用程序入活动状态执行,这个刚好跟上面那个方法相反  
  9. - (void)applicationDidBecomeActive:(UIApplication *)application   
  10. // 当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可  
  11. - (void)applicationDidEnterBackground:(UIApplication *)application  
  12. // 当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反  
  13. - (void)applicationWillEnterForeground:(UIApplication *)application  
  14. // 当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。  
  15. - (void)applicationWillTerminate:(UIApplication *)application  
  16. // 当程序载入后执行  
  17. - (void)applicationDidFinishLaunching:(UIApplication*)application  


20、ViewController 的 alloc,loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. alloc // 申请内存时调用  
  2. loadView // 加载视图时调用  
  3. ViewDidLoad // 视图已经加载后调用  
  4. ViewWillAppear // 视图将要出现时调用  
  5. ViewDidUnload // 视图已经加载但没有加载出来调用  
  6. dealloc // 销毁该视图时调用  
  7. init // 视图初始化时调用  

21、描述应用程序的启动顺序。
(1)程序入口main函数创建UIApplication实例和UIApplication代理实例。
(2)在UIApplication代理实例中重写启动方法,设置第一ViewController。
(3)在第一ViewController中添加控件,实现应用程序界面。

22、为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?请举例说明。
防止循环引用

23、使用UITableView时候必须要实现的几种方法?
- (NSInteger)tableView:(UITableView*)tableViewNumberOfRowsInSection:(NSInteger)section;
这个方法返回每个分段的行数,不同分段返回不同的行数可以用switch来做,如果是单个列表就直接返回单个你想要的函数即可。
-(UITableViewCell*)tableView:(UITableView*)tableViewCellForRowAtIndexPath:(NSIndexPath)indexPath;
这个方法是返回我们调用的每一个单元格。通过我们索引的路径的section和row来确定

24、写一个便利构造器。
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //id代表任意类型指针,这里代表Student *,类方法  
  2. + (id)studentWithName:(NSString *)newName andAge:(int)newAge
  
  3. {
      
  4.     Student *stu=[[Student alloc]initName:newName andAge:newAge];
  
  5.     return [stu autorelease];  
  6.     // 自动释放
  
  7. }  


25、UIImage初始化一张图片有几种方法?简述各自的优缺点。
3种
imageNamed:系统会先检查系统缓存中是否有该名字的Image,如果有的话,则直接返回,如果没有,则先加载图像到缓存,然后再返回。
initWithContentsOfFile:系统不会检查系统缓存,而直接从文件系统中加载并返回。

imageWithCGImage:scale:orientation当scale=1






===========================================================================================


苹果公司作为世界上知名度最高盈利最多的公司之一,其工作offer毫无疑问非常难以获得。


如同大部分硅谷公司一样,苹果会在面试中询问基于你过去工作经历的技术难题,以及与技术不太相关的“烧脑”谜题。


根据美国最大的工作信息网站Glassdoor的面试题目汇总,我们精选出了33道最难的面试题目。有一些需要复杂的数学计算;还有一些虽然简单,但是语义却模糊不清。


准备好了么?我们开始吧!以下是20道技术类职位题目:


1、“我们有一杯热咖啡和一小杯刚从冰箱拿出的冷牛奶。室温介于二者之间。我们什么时候应该把牛奶加入咖啡,以最早地得到温度最低的混合饮品?(开始,中间或最后)?”
——产品设计工程师职位


2、“帝国大厦有多重?”
——解决方案咨询师职位


3、“飞机的机翼是如何工作的?”
——领导系统工程师职位


4、“告诉我五种方法,可以检测出汽车还有多少油。”
——硬件工程师职位


5、“如果你有两个鸡蛋,并且想搞清楚在不摔破鸡蛋的前提下最高能从多高的地方往下扔鸡蛋,你会采取怎样的做法?最优的解决方案是哪种?”
——软件工程师职位


6、“描述一个有趣的难题和如何解决它的办法。”
——软件工程师职位


7、“有100枚硬币躺在桌子上,当然每一枚都有正面和反面。其中10枚正面朝上,90枚反面朝上。你不能摸、看或以其它任何方法来判断每一枚硬币哪面朝上。现在把硬币分成两堆,使得每一堆都有同样数量的正面向上的硬币。”
——软件工程师职位


8、“你会如何测试你最喜欢的一款App?”
——软件测试工程师职位


9、“有三个盒子,一个只装苹果,一个只装橘子,第三个则装有苹果和橘子。盒子被贴上了错误的标签,导致所有标签都没有正确反映盒子里装的是什么。现在只打开一个盒子并且不能向里看,然后用手拿出一个水果。看一眼这个水果,你如何立刻把所有标签对上正确的盒子?”
——软件测试工程师职位


10、“你聪明吗?”(这个问题好难啊。。。)
——构建工程师职位


11、“你曾经有过什么失败的经历?你从中学到了什么教训?”
——软件工程师职位


12、“你是否曾经和经理意见分歧,然后你如何解决这样的分歧?请给出一个具体例子并解释你如何纠正分歧、最终的结果是什么、那个和你产生分歧的人如今怎样评价你。”
——软件工程师职位


13、“你把一杯水放到唱片机转盘上并逐渐增加转盘速度。下面哪件事会第一个发生?杯子滑落、杯子翻倒和杯中水溅出。”
——机械工程师职位


14、“告诉我你生活中曾经做过的一件事,你为之感到特别骄傲。”
——软件工程经理职位


15、“你有创造力吗?你想到过什么有创意的点子?”
——软件工程师职位


16、“你今天为什么来到这里?”
——软件工程师职位


17、“如果一种iTunes应用让许多图片变得陈旧过时,你会采取什么样的策略移除这些废弃的图片?”
——软件工程师职位


18、“过去四年中你最美好的一天是哪天?最坏的一天又是哪天?”
——工程项目经理职位


19、“你为什么想要加入苹果公司?如果苹果公司雇佣你,你会怀念现在这份工作的哪些方面?”
——软件工程师职位


20、“你如何测试一台烤面包机?”
——软件QA工程师职位


我们继续看看那些非技术岗位的“烧脑”面试难题吧!来,今天给出13道非技术题目:


准备好了么?我们开始吧!


1.“向一个5岁小孩解释清楚RAM是什么。”
——苹果专营店店员职位


2.“向一个八岁孩子解释何为调制解调器/路由器以及它的功能。”
——居家专业顾问职位


3.“场景:你正在接待一位生气的顾客,他等了20分钟需求帮助,现在正在制造骚乱。她嚷嚷她要去Best Buy(美国连锁电子产品零售商)或者微软商店去买她想买的电脑。请你解决这个问题。”
——导购职位


4.“一位男士打电话寻求建议,说他有一台基本上就是块大板砖的旧电脑。你会怎么做?”
——苹果保修居家专业顾问职位


5.“描述一下曾经令你感到谦卑的经历。”
——苹果零售店导购职位


6.“下面哪件事更重要?——解决顾客遇到的难题还是为他们创造好的体验?”
——苹果居家专业顾问职位


7.“为什么苹果公司把公司名字从Apple Computers Incorporated改成了Apple Inc.?”
——导购职位


8.“你看起来非常正能量啊,什么类型的事儿能让你感到沮丧?”
——Family Room顾问职位


9.“角色扮演——仅仅使用嗓音,你如何让顾客感受到你很愿意帮助他们?”
——学院居家专业顾问职位


10.“当你作为一名顾客走进一家苹果专卖店时,你会注意到店里的哪些东西?/你走进去第一印象是什么?”
——导购职位


11.“如果你面前有一个混合密度均匀和不均匀硬币的罐子,从中取出一枚硬币抛3次,得出的结果是正面-正面-反面顺序,那么你取出的密度均匀和不均匀硬币的概率是多少?”
——领导分析师职位


12.“每天有多少个婴儿出生?”
——全球供应链经理职位


13.“你如何分解一支笔的成本?”
——全球供应链经理职位



0 0
原创粉丝点击