29、创建控制器、视图的方式
1、使用代码直接创建
2、使用xib创建
3、通过storyboard创建
4、NSClassFromString() 生成类型 然后alloc init 创建
30、简述内存分区情况
栈、堆、全局(静态)、常亮区、代码区
31、队列和栈有什么区别
队列 先进先出
栈 先进后出
32、iOS的系统架构
iOS的系统架构分为四个层次:核心操作系统层(CoreOS layer)、核心服务层(Core Services layer)、媒体层(Medialayer)和可触摸层(Cocoa Touch layer)
33、控件主要响应3种事件
iOS中只有继承了UIResponder才能接收并处理事件,称为响应者对象。
UIApplication、UIViewController、UIView都继承UIResponder。所以他们都是响应者对象,都能接收并处理事件
1)触摸事件
关于UITouch
当用户用一根手指触摸屏幕时,系统会创建一个与手指相关联的UITouche对象
一个手指对应一个UITouch对象
关于UIEvent
每产生一个事件,就会产生一个UIEvent对象
UIEvent:称为事件对象,记录产生的时刻和类型
typedef NS_ENUM(NSInteger, UIEventType) {
UIEventTypeTouches,//触摸
UIEventTypeMotion,//加速器
UIEventTypeRemoteControl,//远程
UIEventTypePresses,3D touch
};
事件的产生和传递
事件的产生
发生触摸事件后,系统就会将该事件加入到一个由UIApplication管理的事件队列中
UIApplication会从事件队列中找到最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)
主窗口会在视图层次结构中找到一个最适合的视图来处理触摸事件,这也是整个事件处理过程的第一步
找到最适合的视图控件后,就会调用视图控件的touches方法来做具体的事件处理
UIApplicaton -> UIWindow -> UIViewControleler -> UIView -> subView
2)加速事件
3)远程控制事件
34、xib文件的构成分为哪3个图标?都具有什么功能
1 File's owner :表示从磁盘加载nib文件的对象
2 First Responder : 用户当前正在与之交互的对象
3 View :显示用户界面
35、简述视图控件器的生命周期
参考28题
36、app 项目的生命周期
(1)应用的生命周期
状态如下:
Not running 未运行 程序没启动
Inactive 未激活 程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态
Active 激活 程序在前台运行而且接收到了事件。这也是前台的一个正常的模式
Backgroud 后台 程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态
Suspended 挂起 程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
(2)简要说明一下APP的启动过程,main文件说起,main函数中有什么参数?作用是什么?
1. 程序入口:
执行 main 函数,设置 AppDelegate 称为函数的代理
2. 程序完成加载
[AppDelegate application:didFinishLaunchingWithOptions:]
3. 创建 window 窗口
4. 程序被激活
[AppDelegate applicationDidBecomeActive:]
5. 当点击 home 键时:
程序取消激活状态
[AppDelegate applicationWillResignActive:]
程序进入后台
[AppDelegate applicationDidEnterBackground:]
6. 点击进入项目工程中:
程序进入前台
[AppDelegate applicationWillEnterForeground:]
程序重新激活
[AppDelegate applicationDidBecomeActive:]
main函数具有两个参数,argc于argv参数,这两个参数代表中启动时间。这两个参数作为UIApplicationMain函数的参数去启动app并对UI文件进行初始化,第三个参数为应用程序的名称,常用nil表示为默认的程序UIApplication类,最后一个参数时我们自定义的代理名称,这个类用于应用程序的代理类以及代码之间的交互操作
(3)UIApplicationMain函数作用
设置主要类(principal class)和代理类(delegate class)。如果主要类(principal class)为nil,将从Info.plist中获取,如果Info.plist中不存在对应的key,则默认为UIApplication;如果代理类(delegate class)将在新建工程时创建。
(4)main函数作用
调用 UIApplicationMain 函数
37、 动画有基本类型有哪几种;表视图有哪几种基本样式。
隐式动画
显示动画
属性动画
I) 基础动画
II) 关键帧动画
动画组
过渡
38、实现简单的表格显示需要设置UITableView的什么属性、实现什么协议?
delegate,dataSource,frame
UITableViewDelegate, UITableViewDataSource
39、Cocoa Touch提供了哪几种Core Animation过渡类型?
过渡动画的动画类型,系统提供了四种过渡动画。
kCATransitionFade 渐变效果
kCATransitionMoveIn 进入覆盖效果
kCATransitionPush 推出效果
kCATransitionReveal 揭露离开效果
40、UIView与CLayer有什么区别?
参考15 一个是控制器 管理行为的 一个是绘图的 负责显示的
41、Quatrz 2D的绘图功能的三个核心概念是什么并简述其作用
上下文:主要用于描述图形写入哪里;
路径:是在图层上绘制的内容;
状态:用于保存配置变换的值、填充和轮廓, alpha 值等。
42、iPhone OS主要提供了几种播放音频的方法?
一、
对于比较短促的声音,比如系统的推送声音和短信声音,官方要求不要超过30s。
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"done" ofType:@"wav"];
NSURL *fileUrl = [NSURL URLWithString:filePath];
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(fileUrl), &soundID);
AudioServicesAddSystemSoundCompletion(soundID,NULL,NULL,soundCompleteCallBack,NULL);
AudioServicesPlaySystemSound(soundID);
优点:C语言的底层写法,节省内存。
缺点:支持的格式有限,音量无法通过音量键控制,而且播放方式单一。
二、
第二种播放方式就是 AVAudioPlayer,这种方式适用于音乐时间比较长,或者对播放的控制性要求比较高的场景。
优点: 抒写效率更高,基本上支持所有的音频格式,对播放的控制,如循环播放,声音大小,暂停等比较方便。
缺点: 相比上一种,对内存的消耗会多些。不支持流式,即无法播放在线音乐。
三、
还有一种就是 AVPlayer,这个和AVAudioPlayer相似,最大的不同,就是支持流播放,即可以播放在线的音乐。
另外,也提供了一些KVO方法来监听缓冲进度和播放进度等附件功能。
43、使用AVAudioPlayer类调用哪个框架、使用步骤?
AVFoundation
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"happy_birthday" ofType:@"mp3"];
NSURL *fileUrl = [NSURL URLWithString:filePath];
self.musicPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:fileUrl error:nil];
self.musicPlayer.delegate = self;
if (![self.musicPlayer isPlaying]){
[self.musicPlayer setVolume:0.6];
[self.musicPlayer prepareToPlay];
[self.musicPlayer play];
}
//暂停
if ([self.musicPlayer isPlaying]){
[self.musicPlayer pause];
}
//播放完成
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
[self.musicPlayer stop];
self.musicPlayer=nil;
self.musicPlayer.delegate = nil;
}
44、有哪几种手势通知方法、写清楚方法名?
iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
45、ViewController的didReceiveMemoryWarning怎么被调用
IOS didReceiveMemoryWarning 的那些事
46、什么时候用delegate,什么时候用Notification?
一对一的时候,并且相互有依赖的话 用delegate
一对多的时候 用Notification
优势:
1.非常严格的语法。所有将听到的事件必须是在delegate协议中有清晰的定义。
2.如果delegate中的一个方法没有实现那么就会出现编译警告/错误
3.协议必须在controller的作用域范围内定义
4.在一个应用中的控制流程是可跟踪的并且是可识别的;
5.在一个控制器中可以定义定义多个不同的协议,每个协议有不同的delegates
6.没有第三方对象要求保持/监视通信过程。
7.能够接收调用的协议方法的返回值。这意味着delegate能够提供反馈信息给controller
缺点:
1.需要定义很多代码:1).协议定义;2).controller的delegate属性;3).在delegate本身中实现delegate方法定义
2.在释放代理对象时,需要小心的将delegate改为nil。一旦设定失败,那么调用释放对象的方法将会出现内存crash
3.在一个controller中有多个delegate对象,并且delegate是遵守同一个协议,但还是很难告诉多个对象同一个事件,不过有可能。
优势:
1.不需要编写多少代码,实现比较简单;
2.对于一个发出的通知,多个对象能够做出反应,即1对多的方式实现简单
3.controller能够传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息
缺点:
1.在编译期不会检查通知是否能够被观察者正确的处理;
2.在释放注册的对象时,需要在通知中心取消注册;
3.在调试的时候应用的工作以及控制过程难跟踪;
4.需要第三方对喜爱那个来管理controller与观察者对象之间的联系;
5.controller和观察者需要提前知道通知名称、UserInfo dictionary keys。如果这些没有在工作区间定义,那么会出现不同步的情况;
6.通知发出后,controller不能从观察者获得任何的反馈信息。
47、用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
48、写一个”标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
49、关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用
const 不可变的值
欲阻止一个变量被改变,可以使用 const 关键字。在定义该 const 变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指定为 const;
在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量;
对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
static作用: 1、修饰函数的局部变量: 特点:有默认值0,只执行一次,运行一开始就开辟了内存,
50、关键字volatile有什么含意?并给出三个不同的例子
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
• 并行设备的硬件寄存器(如:状态寄存器);
•一个中断服务子程序中会访问到的非自动变量(Non-automatic variables);
• 多线程应用中被几个任务共享的变量。
51、一个参数既可以是const还可以是volatile吗? 一个指针可以是volatile 吗?解释为什么。
1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
52、static 关键字的作用
1.作用于变量:用static声明局部变量时,则改变变量的存储方式(生命期),使变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元。这样,使得该局部变量有记忆功能,可以记忆上次的数据,不过由于仍是局部变量,因而只能在代码块内部使用(作用域不变)。
用static声明外部变量-------外部变量指在所有代码块{}之外定义的变量,它缺省为静态变量,编译时分配内存,程序结束时释放内存单元。同时 其作用域很广,整个文件都有效甚至别的文件也能引用它。为了限制某些外部变量的作用域,使其只在本文件中有效,而不能被其他文件引用,可以用static 关键字对其作出声明。
总结:用static声明局部变量,使其变为静态存储方式(静态数据区),作用域不变;用static声明外部变量,其本身就是静态变量,这只会改变其连接方式,使其只在本文件内部有效,而其他文件不可连接或引用该变量。
2.作用于函数:使用static用于函数定义时,对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。
如果想要其他文件可以引用本地函数,则要在函数定义时使用关键字extern,表示该函数是外部函数,可供其他文件调用。另外在要引用别的文件中定义的外部函数的文件中,使用extern声明要用的外部函数即可。
(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; (2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; (3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内; (4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; (5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。
53、列举几种进程的同步机制,并比较其优缺点。
答案: 原子操作 信号量机制 自旋锁 管程,会合,分布式系统
54、进程之间通信的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础 进
55、进程死锁的原因
答案:资源竞争及进程推 进顺序非法
56、死锁的4个必要条件
答案:互斥、请求保持、不可剥夺、 环路
57、死锁的处理
答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁
58、cocoa touch框架
Phone OS 应用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模式,但是它更多地专注于触摸的接口和优化。UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的基本工具,其建立在和 Mac OS X 中一样的 Foundation 框架上,包括文件处理,网络,字符串操作等。
Cocoa Touch 具有和 iPhone 用户接口一致的特殊设计。有了 UIKit,您可以使用 iPhone OS 上的独特的图形接口控件,按钮,以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形,到专业音效,甚至提供设备访问 API 以控制摄像头,或通过 GPS 获知当前位置。Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架,也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架包括:
Core Animation
通过 Core Animation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio
Core Audio 是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。
Core Data
提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用 或大或小的数据模型。
功能列表:框架分类
下面是 Cocoa Touch 中一小部分可用的框架:
音频和 视频Core AudioOpenALMedia LibraryAV Foundation数据管理Core DataSQLite
图 形和动画Core AnimationOpenGL ESQuartz 2D网络/li>BonjourWebKitBSD Sockets
用 户应用Address BookCore LocationMap KitStore Kit
59、自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对 象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置 时,自动释放池就会被释放,池中的所有对象也就被释放。
1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的.3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数 减一.
60、sprintf,strcpy,memcpy使用上有什么要注意的地方
sprintf:它的操作不限于是字符串,虽然目的对象是字符串,但是源对象可以是任意基本类型的数据。这个函数主要是用于其它类型数据向字符串的转换
strcpy:主要是字符串和字符串之间的复制功能。
memcpy:例如void *memcpy(void *dest, const void *src, int n);从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,也就是说他是内存之间的拷贝。
61、你了解svn,cvs等版本控制工具么?
常用git
62、什么是push
git中是上传本地代码到远端 oc中是到下一个页面
63、静态链接库
64、OC三大特性
(1)封装_点语法
(2)继承
(3)多态
65、OC中如何实现多态
66、Objective-C的优缺点
67、对于OC,你认为最大的优点和最大的不足是什么?对于不足之处,现在有没有可用的方法绕过这些不足来实现需求。如果可以话,有没有考虑或者实现过重新实现OC的功能,如果有,具体怎么做?
68、oc中可修改和不可以修改类型
69、我们说的oc是动态运行时语言是什么意思?