1.fame
,
bounds
,
center
,
alpha,opaque,hidden
这些都是 view 的一些基本属性。 frame 是描述该 view 在其父视图中的一块区域。其坐标系是在其父视图中的坐标。我们在进行 view 的初始化时会经常使用到 frame 。 bounds 也是描述该 view 的大小,是其在自身的坐标系中的位置大小。 center 是描述其在父视图的中心位置坐标。我们在进行 view 的位置改变而不改变 view 的大小的时,会使用 center 。 alpha 是用来描述改 view 的透明度从 0 到 1 , 0 表示的是透明, 1 表示不透明。 alpha 支持动画( animation ), alpha = 0 与 hidden = YES 效果一样都是看不到 view ,但是后者相比开销大。在 alpha 等于 0 时 view 接受 touch 事件,但是 hidden 则不接受。并且 hidden 和 apaque 不支持动画。 alpha 并不影响镶嵌在其内部 view 行为,而 hidden 会影响。当把 view 设置为透明背景时,一般把 opaque 设置为 NO ,可以减少开销,优化内存 .opaque 影响图形绘制系统。设置为 YES ,会优化 view 的绘制。
2.nil,NSNULL,NULL 区别
nil 是指向 obj - c 中对象的空指针,是一个对象,在 o - c 中 ni 对象调用方法不会引起 crash 。
Nil 是指向 obj - c 中的类的空指针,表示的是一个空类。
NULL 是指向任何类型的空指针(如 c / c++ 中的空指针),在 objective - c 中是一个数值。
NSNULL 用于集合操作,在集合对象中,表示一个空值的集合对象。
3.KVC and KVO
KVC ( key - value - coding )键值编码,是一种间接操作对象属性的一种机制,可以给属性设置值。通过 setValue : forKey :和 valueForKey ,实现对属性的存取和访问。
KVO ( key - value - observing )键值观察,是一种使用观察者模式来观察属性的变化以便通知注册的观察者。通过 注册 observing 对象 addObserver:forKeyPath:options:context: 和观察者类必须重写方法 observeValueForKeyPath:ofObject:change:context: 。常应用 MVC 模型中,数据库( dataModal )发生变化时,引起 view 改变。
4.NSThread,NSOperation,GCD
NSThread,NSOperation,GCD 是 IOS 中使用多线程的三种方式之一。他们各有优缺点。抽象层次是从低到高的,抽象度越高的使用越简单。
NSThread ,缺点:需要自己维护线程的生命周期和线程的同步和互斥,但是这些都需要耗费系统的资源。优点:比其它两个更轻。
NSOperation, 优点:不需要自己管理线程的生命周期和线程的同步和互斥等。只是需要关注自己的业务逻辑处理,需要和 NSOperationQueue 一起使用。
GCD ,是 Apple 开发的一个多核编程解决方法,优点:比前面两者更高效更强大。
5.autorelease ,ARC 和非 ARC
autorelease 自动释放,与之相关联的是一个自动释放池( NSAutoReleasePool ) .autorelease 的变量会被放入自动释放池中。等到自动释放池释放时( drain )时,自动释放池中的自动释放变量会随之释放。 ios 系统应用程序在创建是有一个默认的 NSAutoReleasePool ,程序退出时会被销毁。但是对于每一个 RunLoop ,系统会隐含创建一个 AutoReleasePool ,所有的 release pool 会构成一个栈式结构,每一个 RunLoop 结束,当前栈顶的 pool 会被销毁。
ARC ,自动应用计数。( iOS 6 加入) IOS 内存管理是基于变量的应用计数的。这样系统帮你管理变量的 release , retain 等操作。
非 ARC ,非自动应用计数。手动管理内存。自己负责系统变量的 release , retain 等操作。做到谁分配谁释放,及 alloc 和 release 像对应。函数返回对象时使用 autorelease 。
可以使用 Xcode 将非 ARC 转化为 ARC , ARC 和非 ARC 混编。可在在编译 ARC 时使用- fno - objc - arc , -fobjc-arc 标签。实际需要看工程是支持还是不支持 ARC 模式。
6.xib , storyboard ,手动书写代码
xib ( interface buider ) , 方便对界面进行编辑。可以在窗口上面直接添加各种视图,优点:直接看到界面的效果,操作简单。缺点:不方便对视图进行动态控制,不灵活。
手动编写代码,继承(主要是 UIView , UIViewController ),优点:可以对视图进行定制,灵活控制方便。缺点:不能马上看到效果,复杂。
storyboard (故事板在 ios6 加入)。优点:可以看到界面效果,能同时进行多个界面的交互,高效快速。缺点:不能进行进行界面的定制,却笑灵活性。
xib 和 storyboard 主要用于界面中的元素位置固定和清楚里面有哪些元素。但是如果需要动态变化界面还是手动编写代码比较好。一般还是各种方式混合使用。
7.loadView,viewDidLoad,ViewDidUnload,viewWillAppear,viewDidAppear,viewwilldDisappear,viewDidDisappear
当 view 的 nib 文件为 nil 时,手动创建界面时调用 loadView ,当 view 的 nib 文件存在时,会在 viewDidLoad 中实现。但是当你的程序运行期间内存不足时,视图控制器收到 didReceiveMemoryWarning 时,系统会检查当前的视图控制器的 view 是否还在使用,如果不在,这个 view 会被 release ,再次调用 loadView 来创建一个新的 View 。viewDidLoad ,不论是从xib中加载视图,还是从loadview生成视图,都会被调用。但是如果改view在栈中下一次显示是不会被调用。ViewWillAppear,ViewDidAppear会在view每次即将可见和完全显示时都会调用。我们会在ViewWillAppear里面进行一些view显示的准备工作,ViewDidDi sappear 和ViewWillDisAppear时会在view每次消失时都会调用。当系统收到didReceiveMemoryWarning通知时显示内存不足时,会调用ViewDidUnload来清理View中的数据和release后置为nil。
8 , copy 和 retain 区别
retain, 相当于指针拷贝。变量的引用计数加一。另外一个指针也指向改地址。
copy ,相当于内容拷贝。变量的引用计数加一。但是自己本身计数不变。开辟另外一个地址空间放入相同变量的值进去。
9,IOS 常用的设计模式
单例模式, DeafutCenter,Deafultqueue 等
MVC 模式, View , model,ViewController 。
观察者模式,通知, KVO
工厂模式,
代理模式, delegate
10. 内存管理和优化
原则:
1.1 谁创建,谁释放(类似于“谁污染,谁治理”)。如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
例如,你在一个函数中alloc生成了一个对象,且这个对象只在这个函数中被使用,那么你必须在这个函数中调用release或autorelease。如果你在一个class的某个方法中alloc一个成员对象,且没有调用autorelease,那么你需要在这个类的dealloc方法中调用release;如果调用了autorelease,那么在dealloc方法中什么都不需要做。
1.2 除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。
1.3 谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。有时候你的代码中明明没有retain,可是系统会在默认实现中加入retain。
优化:
在收到内存 didReceiveMemoryWarning 的警告时,释放掉一些不再需要的资源,注意编码规范,如一些变量不使用需要及时的释放。避免是占用太多的内存空间,有时需要用空间去换取时间,尽量使用一些高效的算法和数据结构节约内存空间。最后使用一些内存检测工具和代码的静态分析查找内存泄漏和分配( instrument , leaks , allocations )。
11 , tableview 的优化
优化:
1.1 正确的复用 cell 。
1.2 减少在返回每个 cell 里面的处理逻辑和处理时间。尽量将数据进行缓存和复用。
1.3 ,尽量减少处理加载和计算的时间,不阻塞 UI 线程。
1.4 ,尽量使用绘制每个 cell 。
1.5 ,设置每个 cell 的 opaque 属性。
1.6 ,尽量返回每行固定的 height 。
1.7 ,在每个 cell 减少图形效果。
1.8 ,分段加载数据。
12 , opengl , quatarz 2d
上面 2 种方式是进行图形绘制会使用到的技术。
quatarz 2d 是 Apple 提供的基于 Core graphic 的绘制基本图形工具库。操作简单方便,能够满足大部分需要。只是适用于 2D 图形的绘制。
opengl ,是一个跨平台的图形开发库。适用于 2D 和 3D 图形的绘制。功能强大但是复杂。
13 、 UIView animateWithDuration
方法 : +(void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations;
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion; // 多一个动画结束后可以执行的操作 .
[UIView animateWithDuration:1.25 animations:^{
CGAffineTransform newTransform = CGAffineTransformMakeScale(1.2, 1.2);
[firstImageView setTransform:newTransform];
[secondImageView setTransform:newTransform];}
completion:^(BOOL finished){
[UIView animateWithDuration:1.2 animations:^{
//自己的操作 } completion:^(BOOL finished){ 自己的操作 }];
}];
14. 机型和尺寸的适配
Iphone 的主要尺寸是 3.5 和 4 英寸。分辨率为: 320*480,480*960 ( retina )。
IPad 主要尺寸是 7.9 和 9.7 英寸。分辨率为: 1024*768 , 2048*1536 ( retina )。
15. 应用程序的生命周期和状态(参照: http://blog.csdn.net/totogo2010/article/details/8048652 )
Not running 未运行 程序没启动
Inactive 未激活 程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态
Active 激活 程序在前台运行而且接收到了事件。这也是前台的一个正常的模式
Backgroud 后台 程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态 (Suspended) 。有的程序经过特殊的请求后可以长期处于 Backgroud 状态
Suspended 挂起 程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
下图是程序状态变化图:
各个程序运行状态时代理的回调:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告诉代理进程启动但还没进入状态保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告诉代理启动基本完成程序准备开始运行
- (void)applicationWillResignActive:(UIApplication *)application
当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
- (void)applicationDidBecomeActive:(UIApplication *)application
当应用程序入活动状态执行,这个刚好跟上面那个方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置 UIApplicationExitsOnSuspend 的键值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
当程序载入后执行
加载应用程序进入前台
加载应用程序进入后台
16. 常用的开源框架
网络框架: ASIHttpRequest , AFNetworking,coocaHttpServer 等。
进度条: SVprogressHUD,MBprogressHUD,
工具类: SSToolKit 等。
分享类: ShareKit 等
日志框架: log4j , cocoa lumberJack 等。
等等。
17. 数据解析( json 和 XML )
json 数据的解析通常借助一些开源的框架如: SBJson , TouchJson,jsonKit,Apple 提供的原生的 JSon 解析 NSJSON Serialization 等。去 json 数据转化为 IOS 中常用的字典等。
XML 数据的解析。 xml 分为 SAX 和 DOM 两种解析方式。
DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。
一般在iOS平台下,比较常用的XML解析类库有如下几种:
NSXMLParser,,这是一个SAX方式解析XML的类库,默认包含在iOS SDK中,使用也比较简单。
libxml2,是一套默认包含在iOS SDK中的开源类库,它是基于C语言的API,所以使用起来可能不如NSXML方便。这套类库同时支持DOM和SAX解析,libxml2的SAX解析方式还是非常酷的,因为它可以边读取边解析,尤其是在从网上下载一个很大的XML文件,就可以一边下载一边对已经下载好的内容进行解析,极大的提高解析效率。
TBXML,这是一套轻量级的DOM方式的XML解析类库,有很好的性能和低内存占用,不过它不对XML格式进行校验,不支持XPath,并且只支持解析,不支持对XML进行修改。
TouchXML,这也是一套DOM方式的XML解析类库,支持XPath,不支持XML的修改。
KissXML,这是一套基于TouchXML的XML解析类库,和TouchXML相比,支持了XML的修改。
TinyXML,这是一套小巧的基于C语言的DOM方式进行XML解析的类库,支持对XML的读取和修改,不直接支持XPath,需要借助另一个相关的类库TinyXPath才可以支持XPath。
GDataXML,这是一套Google开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询。
18. 类继承,类的扩展( extension ),类别( category )
category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有 3 个作用:
(1) 将类的实现分散到多个不同文件或多个不同框架中。
(2) 创建对私有方法的前向引用。
(3) 向对象添加非正式协议。
继承可以增加,修改或者删除方法,并且可以增加属性。
category 和 extensions 的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。
extensions 可以认为是一个私有的 Category 。
19.CAlayer 介绍
一个 UIView 包含 CALayer 树, CALayer 是一个数据模型。包含了一些用来显示的对象, 在 UIView 的子类中都可以找到层这个组件,层是位于固定的画布上的一个子片,可以被覆盖。层是彼此堆叠在一起的最终产生一个界面。除此之层可以包含多个层,通过层可以操作位于此层上面的其他内容,例如旋转,动画,翻页等。
20.app 性能测试方式
通过 Xcode 提供的工具如 Instrument ,测试 CPU , Mermory 性能。也可以适用一些开源的自动化测试工具:如 Frank , KIF 等。
21. 常见的语言编码 (utf-8,unicode,gb2312,gbk)
常见的语言编码有:
GB2312:简体中文编码,一个汉字占用2字节,在大陆是主要编码方式。
BIG5:繁体中文编码。主要在台湾地区采用。
GBK:支持简体及繁体中文,但对他国非拉丁字母语言还是有问题。
UTF-8:Unicode编码的一种。Unicode用一些基本的保留字符制定了三套编码方式,它们分别UTF-8,UTF-16和UTF-32。在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分。UTF-8俗称“万国码”,可以同屏显示多语种,一个汉字占用3字节。为了做到国际化,网页应尽可能采用UTF-8编码。
当然,处理中文时http头也要改成UTF-8编码的-----加上<meta http-equiv="Content-Type" content="text/html; charset=utf-8">。
语言 字符集 正式名称
英语、西欧语 ASCII,ISO-8859-1 MBCS多字节
简体中文 GB2312 MBCS多字节
繁体中文 BIG5 MBCS多字节
简繁中文 GBK MBCS多字节
中文、日文及朝鲜语 GB18030 MBCS多字节
各国语言 UNICODE,UCS DBCS宽字节
22. 常见的加解密方式 (rsa,aes,md5)
常见的加解密方式有:
RSA :基于公钥和私钥的非对程加密算法。适用范围广。
AES :是一种对程加密的流行方式。加密涉及矩阵运算。
MD5:将任意长度的 “ 字节串 ” 变换成一个 128bit 的大整数,并且它是一个不可逆的字符串变换算法,
23.objective - c 语言的优缺点
objc 优点:
1) Cateogies
2) Posing
3) 动态识别
4) 指标计算
5)弹性讯息传递
6) 不是一个过度复杂的 C 衍生语言
7) Objective-C 与 C++ 可混合编程
缺点:
1) 不支援命名空間
2) 不支持运算符重载
3) 不支持多重继承
4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
24 , ios 应用的调试技巧
1. 如遇到 crash ,分析崩溃日志( symbolicatedrash 工具的适用)保留崩溃版本的 .dSYM 文件
2. 在 XCode 中进入断点管理窗口;然后点击右下方的 + ,增加新的 Exception Breakpoint 。
3. 如遇到 EXC_BAD_ACCESS ,打开 Scheme 选项选择 EditScheme 。然后按图勾上 Enable Zombie Objects 和 Malloc Stack 那两项。
4. 有效的日志管理。 NSLog 和加入一些开源的日志管理框架。
5. 程序断点 debug 模式。
25 ,应用程序性能的调优(转 http://www.open-open.com/lib/view/open1365861753734.html )
1. 用 ARC 去管理内存( Use ARC to Manage Memory )
2. 适当的地方使用 reuseIdentifier ( Use a reuseIdentifier Where Appropriate )
3. 尽可能设置视图为不透明( Set View as Opaque When Possible )
4. 避免臃肿的 XIBs 文件( Avoid Fat XiBs )
5. 不要阻塞主进程( Don't Block the Main Thread )
6. 调整图像视图中的图像尺寸( Size Images to Image Views )
7. 选择正确集合( Choose the Correct Collection )
8. 启用 Gzip 压缩( Enable GZIP Compression )
9. 重用和延迟加载视图( Reuse and Lazy Load Views )
10. 缓存,缓存,缓存( Cache,Cache,Cache )
11. 考虑绘图( Consider Drawing )
12. 处理内存警告( Handle Memory Warnings )
13. 重用大开销对象( Reuse Expensive Objects )
14. 使用精灵表( Use Sprite Sheets )
15. 避免重复处理数据( Avoid Re-Processing Data )
16. 选择正确的数据格式( Choose the Right Data Format )
17. 适当的设置背景图片( Set Background Images Appropriately )
18. 减少你的网络占用( Reduce Your Web Footprint )
19. 设置阴影路径( Set the Shadow Path )
20. 你的表格视图 Optimize Your Table Views )
21. 选择正确的数据存储方式( Choose Correct Data Storage Option )
22. 加速启动时间( Speed up Launch Time )
23. 使用自动释放池( Use AutoRelease Pool )
24. 缓存图像( Cache Images-Or not )
25. 尽可能避免日期格式化器( Avoid Date Formatters Where Possible )
26.UIScrollView 的 contentSize 、 contentOffSet 和 contentInset 属性的区别
contentSize 表示 UIScrollView 滚动区域的大小。 UIScrollView 的 frame 属性在设置好了以后不会随内容的变化而变化。
contentOffSet表示是UIScrollView当前显示区域顶点相对于frame顶点的偏移量,一般用来设置UIScrollView显示的位置。
contentInset表示是scrollview的contentView的顶点相对于scrollview的位置,假设你的contentInset = (0 ,100),那么你的contentView就是从scrollview的(0 ,100)开始显示。一般都是(0,0)表示从scrollView的开始显示。
27.IOS6 AutoLayout
AutoLayout是IOS6之后引进的自动布局功能,有点类型有android的相对布局属性。通过勾选AutoLayout设置各种Constraint约束来实现在不同设备和不同方向上的自动布局。 autosizing mask也就是 “springs and struts” 模式。autosizing mask决定了一个view会发生什么当它的superview 改变大小的时候。而autolayout 不仅可以设置superview改变时view所做的变化,还支持当相邻view变化时自己所做的变化。
28 个人登陆这一块做过没有
网站登录检查的基本流程,让他知道会先检查用户名是否存在,才会进一步判断用户名和密码是否匹配。
在这个模块中,主要涉及到 UITextField以及一些 用户输入交互特性
这些都是 view 的一些基本属性。 frame 是描述该 view 在其父视图中的一块区域。其坐标系是在其父视图中的坐标。我们在进行 view 的初始化时会经常使用到 frame 。 bounds 也是描述该 view 的大小,是其在自身的坐标系中的位置大小。 center 是描述其在父视图的中心位置坐标。我们在进行 view 的位置改变而不改变 view 的大小的时,会使用 center 。 alpha 是用来描述改 view 的透明度从 0 到 1 , 0 表示的是透明, 1 表示不透明。 alpha 支持动画( animation ), alpha = 0 与 hidden = YES 效果一样都是看不到 view ,但是后者相比开销大。在 alpha 等于 0 时 view 接受 touch 事件,但是 hidden 则不接受。并且 hidden 和 apaque 不支持动画。 alpha 并不影响镶嵌在其内部 view 行为,而 hidden 会影响。当把 view 设置为透明背景时,一般把 opaque 设置为 NO ,可以减少开销,优化内存 .opaque 影响图形绘制系统。设置为 YES ,会优化 view 的绘制。
2.nil,NSNULL,NULL 区别
nil 是指向 obj - c 中对象的空指针,是一个对象,在 o - c 中 ni 对象调用方法不会引起 crash 。
Nil 是指向 obj - c 中的类的空指针,表示的是一个空类。
NULL 是指向任何类型的空指针(如 c / c++ 中的空指针),在 objective - c 中是一个数值。
NSNULL 用于集合操作,在集合对象中,表示一个空值的集合对象。
3.KVC and KVO
KVC ( key - value - coding )键值编码,是一种间接操作对象属性的一种机制,可以给属性设置值。通过 setValue : forKey :和 valueForKey ,实现对属性的存取和访问。
KVO ( key - value - observing )键值观察,是一种使用观察者模式来观察属性的变化以便通知注册的观察者。通过 注册 observing 对象 addObserver:forKeyPath:options:context: 和观察者类必须重写方法 observeValueForKeyPath:ofObject:change:context: 。常应用 MVC 模型中,数据库( dataModal )发生变化时,引起 view 改变。
4.NSThread,NSOperation,GCD
NSThread,NSOperation,GCD 是 IOS 中使用多线程的三种方式之一。他们各有优缺点。抽象层次是从低到高的,抽象度越高的使用越简单。
NSThread ,缺点:需要自己维护线程的生命周期和线程的同步和互斥,但是这些都需要耗费系统的资源。优点:比其它两个更轻。
NSOperation, 优点:不需要自己管理线程的生命周期和线程的同步和互斥等。只是需要关注自己的业务逻辑处理,需要和 NSOperationQueue 一起使用。
GCD ,是 Apple 开发的一个多核编程解决方法,优点:比前面两者更高效更强大。
5.autorelease ,ARC 和非 ARC
autorelease 自动释放,与之相关联的是一个自动释放池( NSAutoReleasePool ) .autorelease 的变量会被放入自动释放池中。等到自动释放池释放时( drain )时,自动释放池中的自动释放变量会随之释放。 ios 系统应用程序在创建是有一个默认的 NSAutoReleasePool ,程序退出时会被销毁。但是对于每一个 RunLoop ,系统会隐含创建一个 AutoReleasePool ,所有的 release pool 会构成一个栈式结构,每一个 RunLoop 结束,当前栈顶的 pool 会被销毁。
ARC ,自动应用计数。( iOS 6 加入) IOS 内存管理是基于变量的应用计数的。这样系统帮你管理变量的 release , retain 等操作。
非 ARC ,非自动应用计数。手动管理内存。自己负责系统变量的 release , retain 等操作。做到谁分配谁释放,及 alloc 和 release 像对应。函数返回对象时使用 autorelease 。
可以使用 Xcode 将非 ARC 转化为 ARC , ARC 和非 ARC 混编。可在在编译 ARC 时使用- fno - objc - arc , -fobjc-arc 标签。实际需要看工程是支持还是不支持 ARC 模式。
6.xib , storyboard ,手动书写代码
xib ( interface buider ) , 方便对界面进行编辑。可以在窗口上面直接添加各种视图,优点:直接看到界面的效果,操作简单。缺点:不方便对视图进行动态控制,不灵活。
手动编写代码,继承(主要是 UIView , UIViewController ),优点:可以对视图进行定制,灵活控制方便。缺点:不能马上看到效果,复杂。
storyboard (故事板在 ios6 加入)。优点:可以看到界面效果,能同时进行多个界面的交互,高效快速。缺点:不能进行进行界面的定制,却笑灵活性。
xib 和 storyboard 主要用于界面中的元素位置固定和清楚里面有哪些元素。但是如果需要动态变化界面还是手动编写代码比较好。一般还是各种方式混合使用。
7.loadView,viewDidLoad,ViewDidUnload,viewWillAppear,viewDidAppear,viewwilldDisappear,viewDidDisappear
当 view 的 nib 文件为 nil 时,手动创建界面时调用 loadView ,当 view 的 nib 文件存在时,会在 viewDidLoad 中实现。但是当你的程序运行期间内存不足时,视图控制器收到 didReceiveMemoryWarning 时,系统会检查当前的视图控制器的 view 是否还在使用,如果不在,这个 view 会被 release ,再次调用 loadView 来创建一个新的 View 。viewDidLoad ,不论是从xib中加载视图,还是从loadview生成视图,都会被调用。但是如果改view在栈中下一次显示是不会被调用。ViewWillAppear,ViewDidAppear会在view每次即将可见和完全显示时都会调用。我们会在ViewWillAppear里面进行一些view显示的准备工作,ViewDidDi sappear 和ViewWillDisAppear时会在view每次消失时都会调用。当系统收到didReceiveMemoryWarning通知时显示内存不足时,会调用ViewDidUnload来清理View中的数据和release后置为nil。
8 , copy 和 retain 区别
retain, 相当于指针拷贝。变量的引用计数加一。另外一个指针也指向改地址。
copy ,相当于内容拷贝。变量的引用计数加一。但是自己本身计数不变。开辟另外一个地址空间放入相同变量的值进去。
9,IOS 常用的设计模式
单例模式, DeafutCenter,Deafultqueue 等
MVC 模式, View , model,ViewController 。
观察者模式,通知, KVO
工厂模式,
代理模式, delegate
10. 内存管理和优化
原则:
1.1 谁创建,谁释放(类似于“谁污染,谁治理”)。如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
例如,你在一个函数中alloc生成了一个对象,且这个对象只在这个函数中被使用,那么你必须在这个函数中调用release或autorelease。如果你在一个class的某个方法中alloc一个成员对象,且没有调用autorelease,那么你需要在这个类的dealloc方法中调用release;如果调用了autorelease,那么在dealloc方法中什么都不需要做。
1.2 除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。
1.3 谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。有时候你的代码中明明没有retain,可是系统会在默认实现中加入retain。
优化:
在收到内存 didReceiveMemoryWarning 的警告时,释放掉一些不再需要的资源,注意编码规范,如一些变量不使用需要及时的释放。避免是占用太多的内存空间,有时需要用空间去换取时间,尽量使用一些高效的算法和数据结构节约内存空间。最后使用一些内存检测工具和代码的静态分析查找内存泄漏和分配( instrument , leaks , allocations )。
11 , tableview 的优化
优化:
1.1 正确的复用 cell 。
1.2 减少在返回每个 cell 里面的处理逻辑和处理时间。尽量将数据进行缓存和复用。
1.3 ,尽量减少处理加载和计算的时间,不阻塞 UI 线程。
1.4 ,尽量使用绘制每个 cell 。
1.5 ,设置每个 cell 的 opaque 属性。
1.6 ,尽量返回每行固定的 height 。
1.7 ,在每个 cell 减少图形效果。
1.8 ,分段加载数据。
12 , opengl , quatarz 2d
上面 2 种方式是进行图形绘制会使用到的技术。
quatarz 2d 是 Apple 提供的基于 Core graphic 的绘制基本图形工具库。操作简单方便,能够满足大部分需要。只是适用于 2D 图形的绘制。
opengl ,是一个跨平台的图形开发库。适用于 2D 和 3D 图形的绘制。功能强大但是复杂。
13 、 UIView animateWithDuration
方法 : +(void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations;
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion; // 多一个动画结束后可以执行的操作 .
[UIView animateWithDuration:1.25 animations:^{
CGAffineTransform newTransform = CGAffineTransformMakeScale(1.2, 1.2);
[firstImageView setTransform:newTransform];
[secondImageView setTransform:newTransform];}
completion:^(BOOL finished){
[UIView animateWithDuration:1.2 animations:^{
//自己的操作 } completion:^(BOOL finished){ 自己的操作 }];
}];
14. 机型和尺寸的适配
Iphone 的主要尺寸是 3.5 和 4 英寸。分辨率为: 320*480,480*960 ( retina )。
IPad 主要尺寸是 7.9 和 9.7 英寸。分辨率为: 1024*768 , 2048*1536 ( retina )。
15. 应用程序的生命周期和状态(参照: http://blog.csdn.net/totogo2010/article/details/8048652 )
Not running 未运行 程序没启动
Inactive 未激活 程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态
Active 激活 程序在前台运行而且接收到了事件。这也是前台的一个正常的模式
Backgroud 后台 程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态 (Suspended) 。有的程序经过特殊的请求后可以长期处于 Backgroud 状态
Suspended 挂起 程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
下图是程序状态变化图:
各个程序运行状态时代理的回调:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告诉代理进程启动但还没进入状态保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告诉代理启动基本完成程序准备开始运行
- (void)applicationWillResignActive:(UIApplication *)application
当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
- (void)applicationDidBecomeActive:(UIApplication *)application
当应用程序入活动状态执行,这个刚好跟上面那个方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置 UIApplicationExitsOnSuspend 的键值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
当程序载入后执行
加载应用程序进入前台
加载应用程序进入后台
16. 常用的开源框架
网络框架: ASIHttpRequest , AFNetworking,coocaHttpServer 等。
进度条: SVprogressHUD,MBprogressHUD,
工具类: SSToolKit 等。
分享类: ShareKit 等
日志框架: log4j , cocoa lumberJack 等。
等等。
17. 数据解析( json 和 XML )
json 数据的解析通常借助一些开源的框架如: SBJson , TouchJson,jsonKit,Apple 提供的原生的 JSon 解析 NSJSON Serialization 等。去 json 数据转化为 IOS 中常用的字典等。
XML 数据的解析。 xml 分为 SAX 和 DOM 两种解析方式。
DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。
一般在iOS平台下,比较常用的XML解析类库有如下几种:
NSXMLParser,,这是一个SAX方式解析XML的类库,默认包含在iOS SDK中,使用也比较简单。
libxml2,是一套默认包含在iOS SDK中的开源类库,它是基于C语言的API,所以使用起来可能不如NSXML方便。这套类库同时支持DOM和SAX解析,libxml2的SAX解析方式还是非常酷的,因为它可以边读取边解析,尤其是在从网上下载一个很大的XML文件,就可以一边下载一边对已经下载好的内容进行解析,极大的提高解析效率。
TBXML,这是一套轻量级的DOM方式的XML解析类库,有很好的性能和低内存占用,不过它不对XML格式进行校验,不支持XPath,并且只支持解析,不支持对XML进行修改。
TouchXML,这也是一套DOM方式的XML解析类库,支持XPath,不支持XML的修改。
KissXML,这是一套基于TouchXML的XML解析类库,和TouchXML相比,支持了XML的修改。
TinyXML,这是一套小巧的基于C语言的DOM方式进行XML解析的类库,支持对XML的读取和修改,不直接支持XPath,需要借助另一个相关的类库TinyXPath才可以支持XPath。
GDataXML,这是一套Google开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询。
18. 类继承,类的扩展( extension ),类别( category )
category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有 3 个作用:
(1) 将类的实现分散到多个不同文件或多个不同框架中。
(2) 创建对私有方法的前向引用。
(3) 向对象添加非正式协议。
继承可以增加,修改或者删除方法,并且可以增加属性。
category 和 extensions 的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。
extensions 可以认为是一个私有的 Category 。
19.CAlayer 介绍
一个 UIView 包含 CALayer 树, CALayer 是一个数据模型。包含了一些用来显示的对象, 在 UIView 的子类中都可以找到层这个组件,层是位于固定的画布上的一个子片,可以被覆盖。层是彼此堆叠在一起的最终产生一个界面。除此之层可以包含多个层,通过层可以操作位于此层上面的其他内容,例如旋转,动画,翻页等。
20.app 性能测试方式
通过 Xcode 提供的工具如 Instrument ,测试 CPU , Mermory 性能。也可以适用一些开源的自动化测试工具:如 Frank , KIF 等。
21. 常见的语言编码 (utf-8,unicode,gb2312,gbk)
常见的语言编码有:
GB2312:简体中文编码,一个汉字占用2字节,在大陆是主要编码方式。
BIG5:繁体中文编码。主要在台湾地区采用。
GBK:支持简体及繁体中文,但对他国非拉丁字母语言还是有问题。
UTF-8:Unicode编码的一种。Unicode用一些基本的保留字符制定了三套编码方式,它们分别UTF-8,UTF-16和UTF-32。在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分。UTF-8俗称“万国码”,可以同屏显示多语种,一个汉字占用3字节。为了做到国际化,网页应尽可能采用UTF-8编码。
当然,处理中文时http头也要改成UTF-8编码的-----加上<meta http-equiv="Content-Type" content="text/html; charset=utf-8">。
语言 字符集 正式名称
英语、西欧语 ASCII,ISO-8859-1 MBCS多字节
简体中文 GB2312 MBCS多字节
繁体中文 BIG5 MBCS多字节
简繁中文 GBK MBCS多字节
中文、日文及朝鲜语 GB18030 MBCS多字节
各国语言 UNICODE,UCS DBCS宽字节
22. 常见的加解密方式 (rsa,aes,md5)
常见的加解密方式有:
RSA :基于公钥和私钥的非对程加密算法。适用范围广。
AES :是一种对程加密的流行方式。加密涉及矩阵运算。
MD5:将任意长度的 “ 字节串 ” 变换成一个 128bit 的大整数,并且它是一个不可逆的字符串变换算法,
23.objective - c 语言的优缺点
objc 优点:
1) Cateogies
2) Posing
3) 动态识别
4) 指标计算
5)弹性讯息传递
6) 不是一个过度复杂的 C 衍生语言
7) Objective-C 与 C++ 可混合编程
缺点:
1) 不支援命名空間
2) 不支持运算符重载
3) 不支持多重继承
4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
24 , ios 应用的调试技巧
1. 如遇到 crash ,分析崩溃日志( symbolicatedrash 工具的适用)保留崩溃版本的 .dSYM 文件
2. 在 XCode 中进入断点管理窗口;然后点击右下方的 + ,增加新的 Exception Breakpoint 。
3. 如遇到 EXC_BAD_ACCESS ,打开 Scheme 选项选择 EditScheme 。然后按图勾上 Enable Zombie Objects 和 Malloc Stack 那两项。
4. 有效的日志管理。 NSLog 和加入一些开源的日志管理框架。
5. 程序断点 debug 模式。
25 ,应用程序性能的调优(转 http://www.open-open.com/lib/view/open1365861753734.html )
1. 用 ARC 去管理内存( Use ARC to Manage Memory )
2. 适当的地方使用 reuseIdentifier ( Use a reuseIdentifier Where Appropriate )
3. 尽可能设置视图为不透明( Set View as Opaque When Possible )
4. 避免臃肿的 XIBs 文件( Avoid Fat XiBs )
5. 不要阻塞主进程( Don't Block the Main Thread )
6. 调整图像视图中的图像尺寸( Size Images to Image Views )
7. 选择正确集合( Choose the Correct Collection )
8. 启用 Gzip 压缩( Enable GZIP Compression )
9. 重用和延迟加载视图( Reuse and Lazy Load Views )
10. 缓存,缓存,缓存( Cache,Cache,Cache )
11. 考虑绘图( Consider Drawing )
12. 处理内存警告( Handle Memory Warnings )
13. 重用大开销对象( Reuse Expensive Objects )
14. 使用精灵表( Use Sprite Sheets )
15. 避免重复处理数据( Avoid Re-Processing Data )
16. 选择正确的数据格式( Choose the Right Data Format )
17. 适当的设置背景图片( Set Background Images Appropriately )
18. 减少你的网络占用( Reduce Your Web Footprint )
19. 设置阴影路径( Set the Shadow Path )
20. 你的表格视图 Optimize Your Table Views )
21. 选择正确的数据存储方式( Choose Correct Data Storage Option )
22. 加速启动时间( Speed up Launch Time )
23. 使用自动释放池( Use AutoRelease Pool )
24. 缓存图像( Cache Images-Or not )
25. 尽可能避免日期格式化器( Avoid Date Formatters Where Possible )
26.UIScrollView 的 contentSize 、 contentOffSet 和 contentInset 属性的区别
contentSize 表示 UIScrollView 滚动区域的大小。 UIScrollView 的 frame 属性在设置好了以后不会随内容的变化而变化。
contentOffSet表示是UIScrollView当前显示区域顶点相对于frame顶点的偏移量,一般用来设置UIScrollView显示的位置。
contentInset表示是scrollview的contentView的顶点相对于scrollview的位置,假设你的contentInset = (0 ,100),那么你的contentView就是从scrollview的(0 ,100)开始显示。一般都是(0,0)表示从scrollView的开始显示。
27.IOS6 AutoLayout
AutoLayout是IOS6之后引进的自动布局功能,有点类型有android的相对布局属性。通过勾选AutoLayout设置各种Constraint约束来实现在不同设备和不同方向上的自动布局。 autosizing mask也就是 “springs and struts” 模式。autosizing mask决定了一个view会发生什么当它的superview 改变大小的时候。而autolayout 不仅可以设置superview改变时view所做的变化,还支持当相邻view变化时自己所做的变化。
28 个人登陆这一块做过没有
网站登录检查的基本流程,让他知道会先检查用户名是否存在,才会进一步判断用户名和密码是否匹配。
在这个模块中,主要涉及到 UITextField以及一些 用户输入交互特性
刚开始做登录模块时,我将键盘设置为
UIKeyboardTypeEmailAddress类型,不过后来PD一直强调要改回英文键盘(即
UIKeyboardTypeAlphabet类型)。因为对于中文用户来说,EmailAddress类型键盘默认是中文的,输入过程中会有中文提示产生,如下面第二张知乎截图。
除了
键盘类型的使用:_usernameText.keyboardType = UIKeyboardTypeAlphabet;,UITextField还涉及了其它一些细节处理:
1. 设置边框类型:[_usernameText setBorderStyle:UITextBorderStyleRoundedRect];。关于边框类型, 这里有详细说明。
2. 设置默认文案:_usernameText.placeholder = TEXT_LOGIN_NAME_PLACEHOLDER;,给用户友好提示。
3. 设置控件内容的对齐方式:_usernameText.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;, 这里有详细说明。
4. 设置首字符是否默认大写:_usernameText.autocapitalizationType = UITextAutocapitalizationTypeNone;。
5. 设置是否开启纠错提醒:_usernameText.autocorrectionType = UITextAutocorrectionTypeNo;。
6. 设置何时提供clear按钮:_usernameText.clearButtonMode = UITextFieldViewModeWhileEditing;, 这里有相关说明。
7. 设置成为焦点:[_usernameText becomeFirstResponder];。当界面中除了输入框和登录按钮外,最好一开始就让输入框成为响应者,好让键盘遮掉空白部分。
8. 设置是否密文显示:_userpwdText.secureTextEntry = YES;。如果是密码输入框,当然要了。
9. 设置回车键类型:_usernameText.returnKeyType = UIReturnKeyNext;, 这里有更多说明。通常,输入完用户名,我们还需要输入密码,所以设置为UIReturnKeyNext类型;而输入完密码,就完成输入要进行登录了,所以要设置为UIReturnKeyDone类型。
最后,我们还要设置代理:_usernameText.delegate = self;。
通过代理方法,我们可以进行更多的控制,比如:
1. - (BOOL)textFieldShouldReturn:(UITextField *)textField:响应回车键处理。
2. - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string:做一些过滤处理。比如SO上有一份 关于退格键检测的讨论。
更多可参见 官方文档。
1. 设置边框类型:[_usernameText setBorderStyle:UITextBorderStyleRoundedRect];。关于边框类型, 这里有详细说明。
2. 设置默认文案:_usernameText.placeholder = TEXT_LOGIN_NAME_PLACEHOLDER;,给用户友好提示。
3. 设置控件内容的对齐方式:_usernameText.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;, 这里有详细说明。
4. 设置首字符是否默认大写:_usernameText.autocapitalizationType = UITextAutocapitalizationTypeNone;。
5. 设置是否开启纠错提醒:_usernameText.autocorrectionType = UITextAutocorrectionTypeNo;。
6. 设置何时提供clear按钮:_usernameText.clearButtonMode = UITextFieldViewModeWhileEditing;, 这里有相关说明。
7. 设置成为焦点:[_usernameText becomeFirstResponder];。当界面中除了输入框和登录按钮外,最好一开始就让输入框成为响应者,好让键盘遮掉空白部分。
8. 设置是否密文显示:_userpwdText.secureTextEntry = YES;。如果是密码输入框,当然要了。
9. 设置回车键类型:_usernameText.returnKeyType = UIReturnKeyNext;, 这里有更多说明。通常,输入完用户名,我们还需要输入密码,所以设置为UIReturnKeyNext类型;而输入完密码,就完成输入要进行登录了,所以要设置为UIReturnKeyDone类型。
最后,我们还要设置代理:_usernameText.delegate = self;。
通过代理方法,我们可以进行更多的控制,比如:
1. - (BOOL)textFieldShouldReturn:(UITextField *)textField:响应回车键处理。
2. - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string:做一些过滤处理。比如SO上有一份 关于退格键检测的讨论。
更多可参见 官方文档。
29堆和栈
在oc中,当我门想建立一个栈的时候,不用去使用多个数组来自己构成栈,其实每个数组的结构本来就是栈
栈 遵循的是先进后出,也就是先加入的对象是放置在下面的,后来的在上面;
而数组也是类似的,数组添加对象也是有顺序的,在iOS SDK 里面很多地方就是用数组来作为栈存放对象,例如 UINavigationController ,push方法压入栈,
pop方法出栈,就是用数组实现的
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
数组可以代实现栈的功能,但是栈不能实现数组的功能。
用包含的关系来说:数组包含栈
在oc中,当我门想建立一个栈的时候,不用去使用多个数组来自己构成栈,其实每个数组的结构本来就是栈
栈 遵循的是先进后出,也就是先加入的对象是放置在下面的,后来的在上面;
而数组也是类似的,数组添加对象也是有顺序的,在iOS SDK 里面很多地方就是用数组来作为栈存放对象,例如 UINavigationController ,push方法压入栈,
pop方法出栈,就是用数组实现的
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
数组可以代实现栈的功能,但是栈不能实现数组的功能。
用包含的关系来说:数组包含栈
打个比方:栈是数组的父类,数组是栈的子类.