iOS面试合集+答案(一)

一.HTTP post的body体使用form-urlencoded和multipart/form-data的区别。

1)application/x-www-form-urlencoded:
窗体数据被编码为名称/值对,这是标准且默认的编码格式。当action为get时候,客户端把form数据转换成一个字串append到url后面,用?分割。当action为post时候,浏览器把form数据封装到http body中,然后发送到server。

2)multipart/form-data:
multipart表示的意思是单个消息头包含多个消息体的解决方案。multipart媒体类型对发送非文本的各媒体类型是有用的。一般多用于文件上传。
multipart/form-data只是multipart的一种。目前常用的有以下这些类型(注:任何一种执行时无法识别的multipart子类型都被视为子类型"mixed")

二.给你1w让你设计一种机制检测UIViewController的内存泄漏,你会怎么做

如果Controller被释放了,但其曾经持有过的子对象如果还存在,那么这些子对象就是泄漏的可疑目标。

一个小示例:子对象(比如view)建立一个对controller的weak引用,如果Controller被释放,这个weak引用也随之置为nil。那怎么知道子对象没有被释放呢?用一个单例对象每个一小段时间发出一个ping通知去ping这个子对象,如果子对象还活着就会一个pong通知。所以结论就是:如果子对象的controller已不存在,但还能响应这个ping通知,那么这个对象就是可疑的泄漏对象。

三.[通过[UIImage imageNamed:]生成的对象什么时候被释放?]

使用imageNamed这个方法生成的UIImage对象,会在应用的bundle中寻找图片,如果找到则Cache到系统缓存中,作为内存的cache,而程序员是无法操作cache的,只能由系统自动处理,如果我们需要重复加载一张图片,那这无疑是一种很好的方式,因为系统能很快的从内存的cache找到这张图片,但是试想,如果加载很多很大的图片的时候,内存消耗过大的时候,就会会强制释放内存,即会遇到内存警告(memory warnings).

由于在iOS系统中释放图片的内存比较麻烦,所以冲易产生内存泄露。
像[[UIImageView alloc] init]还有一些其他的 init 方法,返回的都是 autorelease 对象。而 autorelease 不能保证什么时候释放,所以不一定在引用计数为 0 就立即释放,只能保证在 autoreleasepool 结尾的时候释放。

像 UIImage 还有 NSData 这种,大部分情况应该是延迟释放的,可以理解为到 autoreleasepool 结束的时候才释放。

四.applicationDidBecomeActive和applicationWillEnterForeground在哪些场景下被调用呢?举例越多越好

1)applicationWillResignActive(将进入后台)

对应applicationWillEnterForeground(将进入前台)

程序将要失去Active状态时调用,比如按下Home键或有电话信息进来,这个方法用来

  • 暂停正在执行的任务;
  • 禁止计时器;
  • 减少OpenGL ES帧率;
  • 若为游戏应暂停游戏;

总结为一个字:停!

2)applicationDidEnterBackground(已经进入后台)

对应applicationDidBecomeActive(已经变成前台)

程序已经进入后台时调用,这个方法用来

  • 释放共享资源;
  • 保存用户数据(写到硬盘);
  • 作废计时器;
  • 保存足够的程序状态以便下次恢复;总结为4个字:释放、保存!

五.dSYM我们可以如何分析的

方法1 使用XCode

这种方法可能是最容易的方法了。

  1. 要使用Xcode符号化 crash log,你需要下面所列的3个文件:
  2. crash报告(.crash文件)
  3. 符号文件 (.dsymb文件)
  4. 应用程序文件 (appName.app文件,把IPA文件后缀改为zip,然后解压,Payload目录下的appName.app文件), 这里的appName是你的应用程序的名称。
  5. 把这3个文件放到同一个目录下,打开Xcode的Window菜单下的organizer,然后点击Devices tab,然后选中左边的Device Logs。
  6. 然后把.crash文件拖到Device Logs或者选择下面的import导入.crash文件。
  7. 这样你就可以看到crash的详细log了。

方法2 使用命令行工具symbolicatecrash

  1. 有时候Xcode不能够很好的符号化crash文件。我们这里介绍如何通过symbolicatecrash来手动符号化crash log。
  2. 在处理之前,请依然将“.app“, “.dSYM”和 ".crash"文件放到同一个目录下。现在打开终端(Terminal)然后输入如下的命令:
  3. export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
  4. 然后输入命令:
  5. /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneO

你可能感兴趣的:(ios,ios)