一、iOS系统架构以及常用框架
1.iOS基于UNIX系统 因此从系统的稳定性来说他要比其他操作系统的产品好很多
2.iOS的系统框架分为四层 由上到下以次可分为:可触摸层(Cocoa Touch layer)、媒体层(Media layer)、核心服务层(Core Services layer)、核心操作系统层(Core OS layer)
触摸层:为应用程序开发提供了各种常用的框架并且大部分的框架与界面有关 本质上说它负责iOS设备上的触摸交互操作
媒体层:通过它我们可以在应用程序中使用各种媒体文件 进行音频与视频的录制 图形的绘制 以及制作基础的动画效果
核心服务层:我们可以通过它来访问一些iOS的服务
核心操作系统层:包括内存管理、文件系统、电源管理以及一些其他的操作系统任务 它可以直接和硬件设备进行交互 核心操作系统层
Cocoa Touch简介
1.在最上层Cocoa Touch层中的很多技术都是基于Objective-C语言的 Objective-C语言为iOS 提供了集合、文件管理、网络操作等支持 比如UIKit框架 它为应用程序提供了各种可视化的组件 比如窗口(Window)、视图(View)和按钮组件(UIButton) Cocoa Touch层中的其他框架 对于我吗在应用程序中的开发来说是非常有用的 如访问用户通信录功能框架、获取照片信息功能的框架、负责加速感应器和三维陀螺仪等硬件支持的框架
应用程序的框架
应用程序项目都是从Cocoa Touch层开始的 具体来说就是从UIKit Framework开始的 挡在编写程序的过程中需要用到一些特殊功能的时候 我们应该从框架最顶端技术开始寻找相应的框架 只有在上层结构无法解决时 才能使用其下层的技术 其实 顶层的框架以及涵盖了我们绝大多数需要的功能
常用的SDK框架功能
AddressBook.framework 提供访问存储核心数据库中用户联系人信息的功能
AddressBookUI.framework 提供一个用户界面 用于显示存储在地址薄中的联系人信息
AudioToolbox.framework 提供音频录制和回放的底层API 同时也负责管理音频硬件
AudioUnit.framework 提供一个接口 让我们的应用程序可以堆音频进行处理
AVFoundation.framework 提供音频录制和回放的底层API 同时也负责管理音频硬件
CFNetwork.framework 访问和配置网络 像HTTP、FTP和Bonjour Services
CoreFoundation.framework 提供抽象的常用数据类型 如 Unicode strings、XML、URL等
CoreGraphics.framework 提供2D绘制的基于C的API
coreLocation.framework 使用GPS和WiFi获取位置信息
Foundation.framework 提供Object-C的基础类(像NSObject)、基本数据类型和操作系统服务等
GameKit.framework 为游戏提供网络功能:点对点互联和游戏中的语音交流
MapKit.framework 为应用程序提供内嵌地图的接口
MediaPlayer.framework 提供播放视频和音频的功能
MessageUI.framework 提供视图控制接口用意处理E-mail和短信
OpenGLES.framework 提供简洁而高效的绘制2D和3D图形的OpenGL API子集
QuartzCore.framework 提供动画特效以及通过硬件进行渲染的能力
StoreKit.framework 为应用程序提供在程序运行中消费的支持
SystemConfiguration.framework 检测当前是否可用和硬件设备状态的能力
UIKit.framework 创建和管理应用程序的用户界面
第三方的有
AFNetworking 网络请求库
SDWebImage 网络图片加载
FMDB 数据库
Masonry 自动布局
二、讲述一次在这个APP中 用户触发了一个事件 引起一个服务请求 然后服务端返回 并且更新前端界面的过程
数据以磁信息格式躺在磁盘上 被马达转动 被磁头读取信号 转换为电信号 被驱动转成二进制放入内存 被Cache读取 被CPU读取 被服务器代码读取 被网卡驱动层层打包 从网卡经过铜线传到交换机 进入光线被射出去 最终达到一个无线路由器 路由器发射微波辐射信号 手机网卡收到信号 驱动层层解包最后传给程序 程序把这段信息经过一个parser得到格式化数据 发通知给控制器 控制器更新视图数据
三、Objective-C的类可以多重继承吗?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
答:Objective-C的类不可以多重继承 可以实现多个接口 通过实现多个接口可以完成C++的多重继承;category是类别 一般情况下用分类好 用Category去重写类的方法 仅对本Category有效 不会影响到其他类与原有类的关系
四、#import跟#include又什么区别 @class呢 #import<>跟#import"" 又有什么区别
#import是Objective-C导入头文件的关键字 #include是C/C++导入头文件的关键字
使用#import头文件会自动只导入一次 不会重复导入 相当于#include和#pragma once @class告诉编译器某个类的声明 当执行时才会去查看文件 可以解决头文件的相互包含 #import<>用来包含系统的头文件 #import用来包含用户头文件
四、属性readwrite、readonly、assign、retain、copy、nonatomic各是什么作用 在哪种情况下用?
1、readwrite是可读可写特性 需要生成getter方法和setter方法时
2、readonly是只读特性 只会生成getter方法不会生成setter方法 不希望属性在类外改变
3、assign是赋值特性 setter方法将传入参数赋值给实例变量 仅设置变量时
4、retain表示持有特性 setter方法将传入参数先保留着 再赋值 传入参数的retaincount会+1
5、copy表示赋值特性 setter方法将传入的对象复制一份 需要完全一份新的变量时
6、nonatomic非原子操作 决定编译器生成的setter getter是否原子操作 aotomic表示多线程安全 一般使用nonatomic
四、对于语句NSString *obj=[[NSData alloc] init];obj在编译时和运行时分别是什么类型的对象
编译时是NSString的类型 运行时是NSData类型的对象
五、常见的Objective-C的数据类型有那些 和C的基本数据类型有什么区别 如NSInteger和int
Objective-C的数据类型有NSString、NSNumber、NSArray、NSMutableArray、NSData等等
这些都是class 创建后便是对象 而C语言的数据基本类型int 知识一定字节的内存空间 用于存放数值 NSInteger是基本数据类型 并是NSNumber的子类 当然也不是NSObject的子类 NSInteger是基本数据类型Int或者Long的别名(NSInteger的定义typedef long NSInteger)它的区别在于 NSInteger会根据系统是23位还是64位来决定 是本身是int还是Long
六、id声明的对象有什么特性
id声明的对象具有运行时的特性 既可以指向任意类型的Objective-C对象
七、Objective-C如何对内存管理的 说说你的看法和解决方法
Objective-C内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池
1、(Garbage Collection)自动内存计数 :这种方式和java类似 在你的程序执行过程中 始终有一个高人在背后准确的帮你收拾垃圾 你不用考虑它什么时候开始工作 怎样工作 你只需要明白 我申请了一段内存空间 当我不在使用从而这段内存成为垃圾的时候 我就彻底的把它忘掉 反正那个高人会帮我收拾垃圾 遗憾的是 那个高人需要消耗一定的资源 在携带设备里面 资源是紧俏商品所以iPhone不支持这个功能 所以"Garbage Collection"内部机制感兴趣的同学可以参考一些其他的资料
解决:通过alloc - initial方式创建的 创建后引用计数+1 那么程序中做相应次数的release就好了
2、(Reference Counted)手动内存计数:就是说 从一段内存被申请以后 就存在一个变量用于保存这段内存被使用的次数 我们暂时把它称为计数器 当计数器变为0的时候 那么就是释放这段内存的时候 比如说 当在程序A里面一段内存被成功申请完成之后 那么这个计数器就从0变成1(我们把这个过程叫做alloc) 然后程序B也需要使用内存 那么计数器就从1变成了2 (我们把这个过程叫做retain) 紧接着程序A不再需要这段内存了 那么程序A就把这个计数器减1(我们把这个过程叫做release) 程序B也不再需要这段内存的时候 那么也把计数器减1(这个过程还是release) 当系统(也就是Foundation)发现这个计数器变成了0 那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc) 顺便提一句 如果没有Foundation 那么维护计数器 释放内存等工作就需要手工来完成
解决:一般由类的静态方法创建的 函数名中不会出现alloc或init字样 如[NSString string] 和[NSArray arrayWithObject:] 创建后引用计数+0 在函数出栈后释放 即相当于一个栈上的局部变量 当然也可以通过retain延长对象的生存期
3、(NSAutoRealeasePool)内存池:可以通过创建和释放内存池控制内存申请和回收的时机
解决:是由autorelease加入系统内存池:内存池是可以嵌套的 每个内存池都需要有一个创建是释放对 就像main函数中写的一样 使用也很简单 比如[[[NSString alloc] initWithFormat:@"Hey you!"] autorelease] 即将一个NSString对象加入到最内层的系统内存池 当我们释放这个内存池时 其中的对象都会被释放
八、原子(atomic)跟非原子(non-atomic)属性又什么区别
1、atomic提供多线程安全 是防止在写未完成的时候被另一个线程读取 造成数据错误
2、non-atomic:在自己管理内存的环境中 解析的访问器保留并自动释放返回值 如果定了nonatomic 那么访问器只是简单的返回了这个值
九、看下面的程序 第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢?为什么?