iOS底层框架浅析

1.简介java

IOS是由苹果公司为iPhone、iPod touch和iPad等设备开发的操做系统。mysql

2.知识点ios

 iPhone OS(如今叫iOS)是iPhone, iPod touch 和 iPad 设备的操做系统。git

iOS系统架构:基于UNIX。分为4个层次:
核心操做系统层(最底层)Core OS
核心服务层 Core Services
媒体层 Media
可触摸层 Cocoa Touchgithub

一、Core OS:面试

它是用FreeBSD和Mach所改写的Darwin, 是开源、符合POSIX标准的一个Unix核心。这一层包含或者说是提供了整个iPhone OS的一些基础功能,好比:硬件驱动, 内存管理,程序管理,线程管理(POSIX),文件系统,网络(BSD Socket),以及标准输入输出等等,全部这些功能都会经过C语言的API来提供。另外,值得一题的是,这一层最具备UNIX色彩,若是你须要把 UNIX上所开发的程序移植到iPhone上,多半都会使用到Core OS的API.objective-c

        核心OS层的驱动也提供了硬件和系统框架之间的接口。然而,因为安全的考虑,只有有限的系统框架类能访问内核和驱动。
        iPhone OS提供了许多访问操做系统低层功能的接口集,iPhone 应用经过LibSystem库来访问这些功能,这些接口集以下所示:
        线程(POSIX线程)
        网络(BSD sockets)
        文件系统访问
        标准I/O
        Bonjour和DNS服务
        现场信息(Locale Information)
        内存分配
        数学计算
       许多Core OS技术的头文件位于目录<iPhoneSDK>/usr/include/,iPhoneSDK是SDK的安装目录。算法

二、Core Services:sql

     Core Services在Core OS基础上提供了更为丰富的功能, 它包含了Foundation.Framework和Core Foundation.Framework, 之因此叫Foundation ,就是由于它提供了一系列处理字串,排列,组合,日历,时间等等的基本功能。Foundation是属于Objective-C的API,Core Fundation是属于C的API。另外Core servieces还提供了其余的功能,好比:
     Security, Core Location, SQLite, 和Address Book. 其中Security是用来处理认证,密码管理,按安全性管理的; Core Location是用来处理GPS定位的;SQLLite是轻量级的数据库,而AddressBook则用来处理电话薄资料的。下面是具体介绍: 
    (1)电话本
         电话本框架(AddressBook.framework)提供了保存在手机设备中的电话本编程接口。开发者能使用该框架访问和修改存储在用户联系 人数据库里的记录。例如,一个聊天程序可使用该框架得到可能的联系人列表,启动聊天的进程(Process),并在视图上显示这些联系人信息等。
    (2)核心基础框架
        核心基础框架(CoreFoundation.framework)是基于C语言的接口集,提供iPhone应用的基本数据管理和服务功能。该框架 支持以下功能:
        Collection数据类型(Arrays、 Sets等);
        Bundles;
        字符串管理;
        日期和时间管理;
        原始数据块管理;
        首选项管理;
        URL和Stream操做;
        线程和运行循环(Run Loops);
        端口和Socket通讯。
        核心基础框架与基础框架是紧密相关的,它们为相同的基本功能提供了Objective-C接口。若是开发者混合使用Foundation Objects 和Core Foundation类型,就能充分利用存在两个框架中的"toll-free bridging"。toll-free bridging意味着开发者能使用这两个框架中的任何一个的核心基础和基础类型,例如Collection和字符串类型等。每一个框架中的类和数据类型的 描述注明该对象是否支持toll-free bridged。若是是,它与哪一个对象桥接(toll-free bridged)。
    (3)CFNetwork
           CFNetwork框架(CFNetwork.framework)是一组高性能的C语言接口集,提供网络协议的面向对象的抽象。开发者可使用 CFNetwork框架操做协议栈,而且能够访问低层的结构如BSD Sockets等。同时,开发者也能简化与FTP和HTTP服务器的通讯,或解析DNS等任务。使用CFNetwork框架实现的任务以下所示:
          BSD Sockets;
          利用SSL或TLS建立加密链接;
          解析DNS Hosts;
          解析HTTP协议,鉴别HTTP和HTTPS服务器;
          在FTP服务器工做;
          发布、解析和浏览Bonjour服务。
    (4)核心位置框架(Core Location Framework)
           核心位置框架(CoreLocation.framework)主要得到手机设备当前的经纬度,核心位置框架利用附近的GPS、蜂窝基站或Wi- Fi信号信息测量用户的当前位置。iPhone地图应用使用这个功能在地图上显示用户的当前位置。开发者能融合这个技术到本身的应用中,给用户提供一些位 置信息服务。例如能够提供一个服务:基于用户的当前位置,查找附近的餐馆、商店或设备等。
    (5)安全框架(Security Framework)
           iPhone OS除了内置的安全特性外,还提供了外部安全框架(Security.framework),从而确保应用数据的安全性。该框架提供了管理证书、公钥/私 钥对和信任策略等的接口。它支持产生加密安全的伪随机数,也支持保存在密钥链的证书和密钥。对于用户敏感的数据,它是安全的知识库(Secure Repository)。CommonCrypto接口也支持对称加密、HMAC和数据摘要。在iPhone OS里没有OpenSSL库,可是数据摘要提供的功能在本质上与OpenSSL库提供的功能是一致的。
    (6)SQLite
         iPhone应用中能够嵌入一个小型SQL数据库SQLite,而不须要在远端运行另外一个数据库服务器。开发者能够建立本地数据库文件,并管理这些 文件中的表格和记录。数据库SQLite为通用的目的而设计,但仍能够优化为快速访问数据库记录。访问数据库SQLite的头文件位 于<iPhoneSDK>/usr/include/sqlite3.h,其中<iPhoneSDK>是SDK安装的目标路径。
    (7)支持XML
         基础框架提供NSXMLParser类,解析XML文档元素。libXML2库提供操做XML内容的功能,这个开放源代码的库能够快速解析和编辑 XML数据,而且转换XML内容到HTML。访问libXML2库的头文件位于目录<iPhoneSDK>/usr/include /libxml2/,其中<iPhoneSDK>是SDK安装的目标目录。数据库

三、Media:

    如同其名,Media层提供了图片,音乐,影片等多媒体功能。图像分为2D图像和3D图像, 前者由Quartz2D来支持,后者则是用OpenglES.与音乐对应的模组是Core Audio和OpenAL, Media Player 实现了影片的播放, 而最后还提供了Core Animation来对强大动画的支持。具体介绍以下:
   (1)图像技术(Graphics Technologies)
         高质量图像是全部iPhone应用的一个重要的组成部分。任什么时候候,开发者能够采用UIKit 框架中已有的视图和功能以及预约义的图像来开发iPhone应用。然而,当UIKit 框架中的视图和功能不能知足需求时,开发者能够应用下面描述的技术和方法来制做视图。
        ① Quartz。核心图像框架(CoreGraphics.framework)包含了Quartz 2D画图API,Quartz与在Mac OS中采用的矢量图画引擎是同样先进的。Quartz支持基于路径(Path-based)画图、抗混淆(Anti-aliased)重载、梯度 (Gradients)、图像(Images)、颜色(Colors)、坐标空间转换(Coordinate-space Transformations)、pdf文档建立、显示和解析。虽然API是基于C语言的,它采用基于对象的抽象表征基础画图对象,使得图像内容易于保存和复用。
        ② 核心动画(Core Animation)。Quartz核心框架(QuartzCore.framework)包含CoreAnimation接口,Core Animation是一种高级动画和合成技术,它用优化的重载路径(Rendering Path)实现复杂的动画和虚拟效果。它用一种高层的Objective-C接口配置动画和效果,而后重载在硬件上得到较好的性能。Core Animation集成到iPhone OS 的许多部分,包括UIKit类如UIView,提供许多标准系统行为的动画。开发者也能利用这个框架中的Objective-C接口建立客户化的动画。
        ③ OpenGL ES。OpenGL ES框架(OpenGLES.framework)符合OpenGL ES v1.1规范,它提供了一种绘画2D和3D内容的工具。OpenGL ES 框架是基于C语言的框架,与硬件设备紧密相关,为全屏游戏类应用提供高帧率(high frame rates)。开发者老是要使用OpenGL框架的EAGL接口,EAGL接口是OpenGL ES框架的一部分,它提供了应用的OpenGL ES画图代码和本地窗口对象的接口。
    (2)音频技术(Audio Technologies)
        iPhone OS的音频技术为用户提供了丰富的音频体验。它包括音频回放,高质量的录音和触发设备的振动功能等。
        iPhone OS的音频技术支持以下音频格式:AAC、Apple Lossless(ALAC)、A-law、IMA/ADPCM(IMA4)、Linear PCM、μ-law和Core Audio等。
       ① 核心音频(Core Audio Family)。核心音频框架家族(Core Audio family of frameworks)提供了音频的本地支持,如表16-1所示。Core Audio是一个基于C语言的接口,并支持立体声(Stereo Audio)。开发能采用iPhone OS 的Core Audio框架在iPhone 应用中产生、录制、混合和播放音频。开发者也能经过核心音频访问手机设备的振动功能。
       核心音频框架:
CoreAudio.framework  定义核心音频的音频数据类型
AudioUnit.framework   提供音频和流媒体文件的回放和录制,而且管理音频文件和播放提示声音
AudioToolbox.framework   提供使用内置音频单元服务,音频处理模块

        ② OpenAL。iPhone OS 也支持开放音频库(Open Audio Library, OpenAL)。OpenAL是一个跨平台的标准,它能传递位置音频(Positional Audio)。开发者能应用OpenAL在须要位置音频输出的游戏或其余应用中实现高性能、高质量的音频。
          因为OpenAL是一个跨平台的标准,采用OpenAL的代码模块能够平滑地移植到其余平台。
     (3)视频技术(Video Technologies)
        iPhone OS经过媒体播放框架(MediaPlayer.framework)支持全屏视频回放。媒体播放框架支持的视频文件格式包括.mov, .mp4,.m4v和.3gp,并应用以下压缩标准:
         ① H.264 Baseline Profile Level 3.0 video,在30 f/s 的状况下分辨率达到640×480像素。注意:不支持B frames;
         ② MPEG4规范的视频部分;
         ③ 众多的音频格式,包含在音频技术的列表里,如AAC、Apple Lossless (ALAC)、A-law、IMA/ADPCM(IMA4)、线性PCM、μ-law和Core Audio等。

二、委托机制与Core location

委托机制是Cocoa Touch的一种设计模式,Core location框架则是提供IOS内建的位置定位功能。

三、预处理

编译源代码分为两个步骤:预处理和编译。

四、MapKit框架

主要类:MKMapView(显示地图、以及地图相关操做)

五、XIB文件全部者

新建立的空XIB文件只有两个对象:文件全部者和第一响应对象。做用是为CurrentTimeViewController建立视图。

六、UIView

  UIView子类都会实现drawRect:方法,其中包含和绘制视图有关的代码。每次绘制UIView实例时,系统会为视图专门准备一个绘图上下文( CGContextRef context = UIGraphicsGetCurrentContext() )。
接着系统会激活该上下文,而后向须要回执的UIView对象发送drawRect:消息。
注意:只能在drawRect:方法中调用绘图方法或函数。
除了drawRect:方法,没法从其余地方得到激活状态的CGContextRef.也就没法调用灰土方法或函数。

七、UIScrollView

为了让用户可以滚动视图,能够将视图设置为UIScrollView的子视图,主要涉及它的setContentSize方法。
要实现缩放功能,则须要为UIScrollView设置委托对象UIScrollViewDelegate协议并使用setMinimumZoomScale,setMaximumZoomScale方法来启用缩放功能,且要实现viewForZoomingInScrollView:(该方法返回UIScrollView对象须要缩放的视图)。

八、隐藏状态条

[UIApplication shareApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]

九、UITabBarController

负责视图的交换工做,使用时可能涉及到的方法是setViewControllers:,给该方法传入每一个Tab对应的ViewController数组。(每一个视图控制对象都有一个类型为UITabBarItem的实例变量,负责标签条上显示的文字和图标)。

十、UIWindow

实现了一个名为setRootViewController:的方法,将UIViewController实例做为参数传入该方法,传入的视图控制对象的视图会自动加入该窗口,成为窗口的子视图并调整大小和窗口保持一致。窗口对象也会保留它的根视图对象。

十一、载入XIB文件

建立UIViewController子类实例时,经过指定初始化方法 initWithNibName:bundle: 传入XIB的文件名。当视图控制对象须要使用实例变量view的时候,会查看应用程序包内是否存在相应名称的XIB文件(若是传入的名称是nil,那么UIViewController对象会查找和这个UIViewController子类的类名匹配的XIB文件)。

十二、UIVIewController

视图控制对象也是经过alloc和init建立的,可是视图控制对象只有在真正须要视图是,才会经过调用loadView来建立,这种作法可以提升内存使用效率。
注意:
一、在UIViewController里面使用了timer,会使得controller被retain,所以在viewdisapper时应将timer置为nil,不然controller的dealloc不会被执行。
二、若是在UIViewController里面使用ASIHttprequest发送了async请求,而且将request的delegate设置为controller,若请求没回来时就销毁了controller,会使得request的delegate变为野指针,解决方案是:销毁controller时,调用request的cancel来取消请求,或者将request的delegate设置为nil。另一种应对delegate变为野指针的方法是,假设delegate的类是A ,若object_getClass(delegate) != [A class] 说明是野指针了,此时就不能对delegate调用函数了。

1三、UITableView  UITableViewController  UITableViewCell对象 

一、使用UITableView时必需要指定它的数据源,该数据源必须遵照 UITableViewDataSource 协议 ,同时也要为 UItableView 对象设置 UITableViewDelegate 委托, UITableViewController 能够做为 UITableView的数据源、视图控制对象和委托对象。

二、几个关于UITableVIewController的重要方法:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; //返回table中section的个数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section //返回每一个Section的行数
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath //具体行

三、UITableViewCell是UIView的子类。UITableViewCell对象也有本身的子视图:contentView,真正负责显示UITableViewCell的是contentView下的另外三个子视图,分别是:textLabel detailTextLabel imageView. UITableViewCell还有一个UITableViewCellStyle属性,用于决定使用那些子视图以及这些子视图在contentView中的位置。

四、重用UITableViewCell对象,因为IOS设备内存有限,因此必须采用重用UITableViewCell对象的机制。即当用户滚动表格是,部分UITableViewCell对象会移出窗口,咱们把移出的UITableViewCell对象放入UITableViewCell对象池,等待重用。每一个UITableViewCell对象都有一个 reuseIdentifier 属性,类型为NSString,经过想表格视图传入特定的NSString对象,数据源就能够查询并获取一个可重用的UITableViewCell对象。以下列代码是获取可重用对象:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

五、UITableView对象有一个editing属性,设置为YES时,UITableView对象就会进入编辑模式。

1四、UINavigationController 导航控制器

一、UITabBarController对象能够切换没有相互依存关系的状况的视图,而且必须在初始化时设置好全部的视图控制对象,但若是屏幕键互有关联,就要使用导航控制对象。


二、使用 UINavigationController显示多个屏幕的信息时,他会以栈的形式保存全部的屏幕,这里的栈实际上是NSArray对象,经过发送viewController消息能够获得整个栈(返回一个NSArray对象),也可使用push和pop两种方法的推入和推出视图。

三、UIViewController对象有一个navigationItem属性,类型为UINavigationItem.和UINavigationBar不一样,UINavigationItem不是UIView的子类,不能在屏幕上显示,但 UINavigationItem 可以为 UINavigationBar对象提供绘图所需的内容。当某个UIViewController对象成为UINavigationController的栈顶对象时,UINavigationBar对象会使用UIViewController对象的navigationItem并设置相应的属性。UINavigationItem能够包含leftBarButtonItem rightBarButtonItem titleView三个能够自定义的部分。

四、SEL的数据类型是指针,指向选择器(selector)。选择器是方法的惟一标识。将方法名传给 @selector() 指令,能够获得指向相应方法的SEL(@selector不会检查相应的方法是否存在)。

五、UIView实例存在一个endEditing:消息,当视图收到该消息时,若是视图是当前的第一相应对象,就会取消本身的第一响应对象状态,并且虚拟键盘也会消失(传入的参数表明是否须要强制取消第一响应对象状态,YES表明强制退出), textField也能够经过resignFirstResponder来取消第一响应状态。

1五、相机

一、UIImageView对象会根据contentMode属性显示图片,该属性决定图片在frame中的显示位置和缩放模式,默认值是UIViewContentModeCenter(即根据UIImageView对象的bounds居中显示图片,没有缩放),此外还有属性UIViewContentModeScaleToFill/AspectFit/AspectFill等.

 

二、UIToolbar对象和UINavigationBar相似,区别是UINavigationBar只能有两个UIBarButtonItem对象,而UIToolbar能够有一组UIBarButtonItem对象。

 

三、启用相机拍照功能须要用到UIImagePickerController实例,而且必须设定其实例属性sourceType并设置委托对象(UIImagePickerControllerDelegate),此外,因为UIImagePickerController是UINavigationController的子类,因此也须要遵照UINavigationControllerDelegate协议。

sourceType有三种 :

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. UIImagePickerControllerSourceTypeCamera:用户将拍摄一张新照片。  
  2. UIImagePickerControllerSourceTypePhotoLibrary:显示界面,让用户选择相册,而后从该相册选择一张照片。  
  3. UIImagePickerControllerSourceTypeSavedPhotosAlbum:让用户从最近拍摄的照片里选择一张照片。  
  4. 选中照片时会触发UIImagePickerControllerDelegate下的imagePickerController:didFinishPickingMediaWithInfo:消息,经过该消息能够获取选择的图片对象(UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage])。  


四、在弹出照片选择的视图的时候,咱们会用到当前视图控制器的presentModalViewController:animated:方法以模态的形式显示视图,关闭时也须要用到dismissModalViewControllerAnimated:方法。

 

五、 类型为CFUUIDRef的对象能够表明UUID(GUID),CFUUIDRef不是Objective-C对象,而是由Core Foundation API提供的C结构。Core Foundation是一套C语言API,包含编写应用所需的基本构件,例如字符串、数组对象和字典对象。

Core Foundation类以CF为前缀,以Ref为后缀。须要注意的是:不少Core Foundation对象都有Objective-C版本,例如 NSString,NSArray等,但CFUUIDRef没有,而且和Objective—C没有任何关联。庆幸的是咱们只须要简单的类型转换就能够将它转换为字符串形式,这种特性称为无损桥接(toll-free bridging).
代码示例:
CFUUIDRef newUniqueID = CFUUIDCreate(kCFAllocatorDefault);
CFUUIDRef newUniqueIDString = CFUUIDCreateString(kCFAllocatorDefault, newUniqueID);
使用完毕后要释放对象(当C函数的函数名包含英文单词Create时,条用房须要负责释放返回对象):CFRelease(newUniqueID); CFRelease(newUniqueIDString);

 

六、取消点击textField出现的键盘:[textField resignFirstResponder]; //取消第一响应对象状态

1六、UIPopoverController(针对iPad)与模态视图控制对象

一、前面了解到,如今有四种显示视图控制对象的方法:
设置UIWindow实例的跟视图控制对象、压入UINavigationController栈,加入UITabBarController对象和以模态形式显示。

 

二、UIViewController对象会在运行时自动根据当前的设备载入不一样的XIB文件。UIViewController对象拥有一个nibName属性,建立该对象时,须要经过初始化方法为这个nibName属性赋值(若是传入nil,就等同于将这个类的类名设置为nibName属性)。当视图控制对象须要载入视图时,会载入和nibName匹配的XIB文件。若是应用是在iPad上运行的,就会先查找并载入后缀为~ipad的XIB文件。

 

三、判断设备类型:经过UIDevice类发送currentDevice方法,能够获得UIDevice对象,而后检查该对象的userInterfaceIdiom属性,该属性只有两种值:UIUserInterfaceIdiomPad 和 UIUserInterfaceIdiomPhone.

 

四、UIPopoverController对象可以在一个带边框的窗口中显示另外一个视图控制对象的视图,方法是将“另外一个”视图控制对象设置为该对象的 contentViewController.(注意:在iPad中使用UIImagePickerController对象时,必须借助UIPopoverController对象才能正确显示),同时须要遵照UIPopoverControllerDelegate协议。

 

五、每一个视图控制对象都有一个名为 modalViewController 和一个名为 parentViewController 的属性,分别用于存储模态显示状态下相应的子视图和父视图对象。

 

六、模态视图控制对象的样式:iPhone中的模态视图控制对象会占据整个窗口。对于iPhone,这是默认也是惟一的样式选择。对于iPad则有两种额外的选项:表单样式(form sheet)和页单样式(page sheet),可经过modalPresentationStyle属性来设置,modalTransitionStyle能够来设置过渡动画。

1七、保存、读取与多任务处理

一、应用沙盒(Application Sandbox):就是应用的文件系统目录。应用沙盒包含如下几个目录:

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. * 应用程序包(application bundle):包含全部的资源文件和可执行文件,而且是只读目录。  
  2. * Library/Preferences/:存放全部的偏好设置,经过NSUserDefaults类来存取,iTunes会在同步设备是备份该目录。  
  3. * tmp/:用于保存应用运行时所需的临时数据,经过函数NSTemporaryDirectory能够获得应用沙盒下tmp目录的全路径。  
  4. * Documents/:保存应用运行时生成的须要保留的数据,iTunes同步设备室会备份该目录。  
  5. * Libraty/Caches/:保存应用运行是生成的须要保留的数据,iTunes不会在同步设备是备份该目录。  

 

二、获取文件路径:NSSearchPathForDirectoriesInDomains:返回NSArray对象,但在iPhone上只有一个Document目录,因此直接取第一个就好了。还能够经过NSHomeDirectory函数获得应用程序根路径,而后把Documents目录拼到根路径后面:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"],从而获得全路径。

 

三、 固化(archiving)是将单个或多个对象从内存写入文件系统的过程。解固(unarchiving)则是从文件读取对象并写回内存。

 只有遵照NSCoding协议的对象才能够固化,固化的实际经过须要经过NSCoder实例来完成,NSCoder实例自己就是一个数据容器,能够存放对象和对象的数据。
NSCoding协议两个必须实现的方法:encodeWithCoder:(固化用)和initWithCoder:(解固用)。
NSKeyedArchiver的类方法archiveRootObject:toFile:能够将遵照NSCoding协议的对象写入文件,而且须要在encodeWithCoder:方法中再实现具体固化代码(使用NSCoder的encodeObject:forKey:方法)。
NSKeyedUnarchiver的类方法unarchiveObjectWithFile:来解码固化后的对象,而且须要在initWithCoder:方法中再实现具体解固代码(使用NSCoder的decodeObjectForKey:)。

 

四、应用程序的几种状态:未运行、激活、未激活、后台运行、挂起状态(暂停).

 

五、在Object—C中,能够经过NSData建立、维护和释放内存缓冲区,保存必定数量的二进制数据,使用NSData的writeToFile:方法,能够将转化为NSData类型的数据写入到本地文件中去。使用NSFileManager的defaultManager实例的removeItemAtPath:方法来删除文件。

UIImageJPEGRepresentation函数将会将一个UIImage对象压缩并返回为 NSData 对象。

1八、通告机制与设备转动

一、 每一个应用都有一个 NSNotificationCenter 实例,经过defaultCenter消息得到。使用通知中心实例的 addObserver:selector:name:object:方法能够将指定对象注册为观察器,由通告触发的方法会带一个参数,该参数是一个NSNotification对象,有三个属性:object,name,userInfo(NSDictionary对象)。
 发送通告:[[NSNotificationCenter defaultCenter] postNotification: NSNotification实例];
通告中心不会保留观察器,在通告中心注册过的对象,必须在释放前取消注册。不然,当响应的通告再次出现时,通告中心仍然会向该观察器发送消息,由于相应的对象已经释放了,因此会致使应用崩溃。

 

二、UIDevice 对象会不间断地发送通告。如下是UIDevice 对象所发通告的名称常量。

UIDevice Orientation/BatteryState/BatteryLevel/ProximityState DidChangeNotification .

1九、Core Data

一、 要将数据保存在本地服务器中,可使用固化或者CoreData。固化最大的缺点是数据必须整存整取,要访问固化文件中的任何数据,必须解固整个文件,要更新数据的任何变更,必须重写整个文件。Core Data没有这样的缺点。弱国须要在文件系统和RAM之间传送大量模型对象,那么CoreData这种增量读取、更新、删除和插入的特性能够大幅提升应用的性能。
 Core Data框架提供的是对象关系映射(ORM)模型,即可以将Objective-C对象转化为数据,以保存在SQLLite数据库文件中,也可将保存后的数据还原成Objective-C对象。

 

二、经过 CoreData 取回的对象,默认状况下都是 NSManagedObject 实例。NSManagedObject是NSObject的子类,也是CoreData的重要组成部分,它相似于字典对象,能够存取任意的键值对,即NSManagedObject对象会为全部的实体属性保存响应的键值对。

若是须要在建立 NSManagedObject 对象后作一些额外的工做,就应该覆盖 awakeFromFetch 方法,而不是init方法,此外,该对象的 setPrimitiveValue:forKey: 方法能够为指定的属性设置值。还有 awakeFromInsert 方法。

 

三、NSManagedObjectContext 对象:负责应用和数据库之间的交互,经过 NSManagedObjectContext 对象的 NSPersistentStoreCoordinator 对象,能够指定文件路径并打开响应的 SQLite 数据库。 而 NSPersistentStoreCoordinator 对象须要使用一个 NSManagedObjectModed 实例,这个实例表明某个 CoreData 模型文件。

要经过 NSManagedObjectContext 实例获得这些对象,就必须设置并执行 NSFetchRequest 对象,而 NSFetchRequest 对象还须要一个实体描述对象 NSEntityDescription 来具体定义所要建立或取回的实体类型。

还能够经过为 NSFetchRequest 对象增长 NSPredicate 对象,返回符合指定条件的对象。此外,这个对象还能够用于数组的过滤。

 

四、#pragma mark 经常使用来为方法分组,编译器会忽略这种标识,可是Xcode可以识别这种宏,它使方法的查看更加快速方便。

20、NSUserDefaults

一、每一个应用都有一个 NSUserDefaults 实例。向 NSUserDefaults 类发送 standardUserDefaults 消息能够获得该实例,它相似于 NSMutableDictionary,能够经过键存取或者删除对象。当应用第一次使用 NSUserDefaults 实例时,会自动从文件读取;修改数据后, NSUserDefaults 实例会自动将数据写入文件。NSUserDefaults 的键必须是字符串类型,值必须是可序列化的对象。

 

二、偏好设置键的经常使用命名规定:应用名 + 偏好设置名 + 单词prefKey

2一、方向感应器

一、方向感应器经过跟踪做用在其X,Y,Z轴上的重力,侦测设备所处的方向,经过方向感应器返回的数据,还能够侦测设备运动速度的变化。

 

二、UIAccelerometer加速计是用来检测iphone手机在x y z轴三个轴上加速度的共享API对象,UIAcceleration是表示加速度的类,它包含了来自加速计UIAccelerate的全部数据,有三个属性值:x y z.iphone的加速计支持最高一每秒一百次的频率进行轮询。

 

三、要获取方向感应器的数据,首先要获得应用的 UIAccelerometer 实例(共享实例sharedAccelerometer),而后设置该对象的实例变量 updateInterval 和 delegate,即UIAccelerometerDelegate委托。相应的委托对象须要实现 accelerometer:didAccelerate: 方法,经过传入 accelerometer:didAccelerate: 方法的 UIAccelerometer对象 和 UIAcceleration对象,该方法能够根据updateInterval设置的时长,每隔一段时间报告方向感应器的数据变化。

 

四、要侦测用户摇动设备的动做,须要在加速感应器传出的信号上执行一些复杂的数学运算,不过UIResponder类所实现的方法能够替咱们完成这些计算工做。motionBegan:withEvent: 和 motionEnded:withEvent: 和 motionCancelled:withEvent: 。

2二、 iOS网络编程

支持协议:   
• 文件传输协议(ftp://)
• 超文本传输协议(http://)
• 安全128-bit超文本传输协议(https://)
• 本地文件路径(file:///)
访问URL步骤:
• 构造NSURL,,使用NSURL构造一个URL
• 生成一个NSURLRequest,使用NSURLRequest构造一个请求
• 经过NSURLConnection发送请求,使用NSURLConnection发送一个请求,并返回数
• 经过返回的NSURLResponse和NSError分析结果 ,使用NSURLResponse和NSError来监测响应和错误信息
一、 NSURL
一个典型的URL以下:

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. http://lily:123456@www.google.com/search?hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page  
[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. URL组成1:  
  2. absoluteString: http://lily:123456@www.google.co ... =f&oq=&aqi=g10#page   
  3. absoluteURL: http://lily:123456@www.google.co ... =f&oq=&aqi=g10#page  
  4. baseURL - 若是在构造URL对象时没有指定,则为nil  
  5. fragment: page  
  6. host: www.google.com  
  7. URL组成2:  
  8. port: 80,若是没有指定,则为nil  
  9. path: /search  
  10. query: hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10  
  11. relativePath: /search  
  12. relativeString: http://lily:123456@www.google.com:80/search? hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page  
  13. URL组成3:  
  14. user: lily  
  15. password: 123456   
  16. scheme: http  
  17. 如何构造一个url  
  18. • + (id)URLWithString:(NSString *)URLString  
  19. • + (id)URLWithString:(NSString *)URLString relativeToURL: (NSURL *)baseURL  
  20. • + (id)fileURLWithPath:(NSString *)path isDirectory: (BOOL)isDir  
  21. • + (id)fileURLWithPath:(NSString *)path  
  22. ----------------------------------------------------------  
  23. • - (id)initWithScheme:(NSString *)scheme host:(NSString *)host path:(NSString *)path  
  24. • - (id)initWithString:(NSString *)URLString  
  25. • - (id)initWithString:(NSString *)URLString relativeToURL:(NSURL *)baseURL  
  26. • - (id)initFileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir  
  27. • - (id)initFileURLWithPath:(NSString *)path  

二、NSURLRequest:
 
封装了一个针对某个URL的请求信息,能够指明内容的缓存策略构造URL请求:

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. • + (id)requestWithURL:(NSURL *)theURL  
  2. • + (id)requestWithURL:(NSURL *)theURL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInter val)timeoutInterval  
  3. • - (id)initWithURL:(NSURL *)theURL  
  4. • - (id)initWithURL:(NSURL *)theURL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInter val)timeoutInterval  
  5. 支持的缓存策略:  
  6. NSURLRequestUseProtocolCachePolicy   
  7. NSURLRequestReloadIgnoringLocalCacheData   
  8. NSURLRequestReloadIgnoringLocalAndRemoteCacheData   
  9. NSURLRequestReloadIgnoringCacheData   
  10. NSURLRequestReturnCacheDataElseLoad   
  11. NSURLRequestReturnCacheDataDontLoad   
  12. NSURLRequestReloadRevalidatingCacheData  

可修改的URL请求
• 若是须要在初始化后仍能对URL请求对象进行修改,可使用NSMutableURLRequest,能够修改的项目包括:
• 缓存策略
• 超时时间
• URL对象
• 主文档地址
• 头信息
• 上行内容 
• 请求方法
• Cookie
 
发送请求:
可使用同步或异步的方式发送一个请求,二者的结果 返回内容不一样

 

三、NSURLConnection

 同步请求:

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. • + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error  

• 最快捷的方式
• 不能监控内容下载过程
 
返回数据的处理
• 返回数据封装以NSData
• 通常将其转换为NSString后,才进行处理 
• NSString类中经常使用的转换方法:

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. • - (id)initWithData:(NSData *)data encoding: (NSStringEncoding)encoding  

 

1) NSURLResponse

响应的处理:

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. • NSURLRequest对应的响应的元信息封装在NSURLResponse中   
  2. • - (long long)expectedContentLength   
  3. • - (NSString *)suggestedFilename  
  4. • - (NSString *)MIMEType  
  5. • - (NSString *)textEncodingName   
  6. • - (NSURL *)URL  

 

2) NSError  错误的处理

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. • 若是请求过程当中发生错误,致使请求没法完成,则 error对象不为nil  
  2. • - (NSString *)localizedDescription  
  3. 异步请求  
  4. • 不影响当前正在进行操做   
  5. • 数据分屡次按顺序返回  
  6. 异步请求步骤:  
  7. • 构造链接对象(NSURLConnection)  
  8. • 发送请求  
  9. • 使用委托监控数据返回过程  
  10. • 将屡次返回的数据链接成同一个数据对象  
  11. • 使用链接后的数据对象  
  12. 构造链接  
  13. • + (NSURLConnection *)connectionWithRequest: (NSURLRequest *)request delegate:(id)delegate  
  14. • - (id)initWithRequest:(NSURLRequest *)request delegate: (id)delegate  
  15. • - (id)initWithRequest:(NSURLRequest *)request delegate: (id)delegate startImmediately:(BOOL)startImmediately  
  16. 发送请求  
  17. • - (void)start  
  18. • - (void)cancel  
  19.    
  20. 使用委托  
  21. • - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  
  22. • - (void)connectionDidFinishLoading:(NSURLConnection *)connection  
  23. • - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  


UIWebView
• 内置的浏览器
• 能够显示HTML/XHTML内容,以及执行Javascript脚本 • 能够控制浏览器的内容和访问的URL
• 能够执行前进/后退/刷新等动做
• 能够经过委托监测URL的下载过程
UIWebView经常使用API

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. • - (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL  
  2. • - (void)loadRequest:(NSURLRequest *)request  
  3. • - (void)reload  
  4. • BOOL detectsPhoneNumbers  
  5. • BOOL scalesPageToFit  
2三、控件默认高度

一、状态栏
状态栏通常高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用。
二、导航栏
在纵向模式下导航栏为44像素高,在横向模式下为32像素高,导航栏提供了一个不多用的提示模式,该模式将高度扩展了30像素,在纵向模式下为320*74像素,在横向模式下为480*74像素。
三、选项卡  工具栏
选项卡为48像素高,工具栏为44像素高。此两个UI元素通长不用于横向模式。
四、键盘和pickerView
此通常都为横向320*216像素,纵向为480*162像素。
五、UIScreen类
[[UIScreen mainScreen] applicationFrame]通常会根据正在使用的工具栏,状态栏,导航栏来返回可用的区域。


开发经验

一、  在每一个页面的入口和出口(通常是viewDidLoad和dealloc)打上日志,能够了解用户的操做流程,并查出页面在关闭时是否销毁了相应的对象。
二、  定时器NSTimer 须要在一个新线程中运行,不然UI操做会阻塞定时器。
三、 须要为定时器所在的线程设置NSRunLoop,不然定时器可能不会动。
四、  若是在线程中设置了NSRunLoop,须要在销毁线程时也将其中止,使用CFRunLoopStop 。
五、  全部的UI操做都应该在主线程中执行,不然会致使应用崩溃(不必定是当即崩溃)。
六、  若是项目中有c函数,出现同名的函数会致使应用编译失败,即便这些c函数处于不一样的页面中。
七、  使用ASIHttpRequest,同步下载过程是不能被取消的,异步下载过程才能够被取消。
八、  应用内支付,支付成功的回调里面,还须要对加密数据transactionReceipt 进行验证,避免越狱的机器使用 IAPFree 等软件伪造数据。
九、  不要试图获取设备的UDID,不然会形成应用审核不经过。可使用OpenUDID 或者 Mac 地址代替。
十、将比较费时的操做不要放在主线程中执行,避免UI响应慢。应该在一个新线程中执行(对有同步要求的操做除外)。
十一、使用最新的Xcode and iOS SDK进行开发,对高版本的兼容性会好一些。例如Mac 10.6下只能安装Xcode4.2and iOS SDK 5.0 ,对iOS 5.1版本的系统就不能直接调试。
十二、 图片命名:例若有一张图片为 MyImage.png,为了兼容不一样设备,须要存为不一样分辨率的图片,命名规则以下:
MyImage.png - 默认的图片名称。
MyImage@2x.png - 适用于Retina 显示屏的高分辨率图片。
MyImage~iphone.png - 适用于iPhone 和 iPod touch的图片。
MyImage@2x~iphone.png - 适用于iPhone and iPod touch 设备 Retina 显示屏的高分辨率图片。
在显示图片时,只须要直接取 @"MyImage.png",系统就能根据当前的设备,自动读取相应的图片了。
注意:以上图片命名规则只使用于UIKit框架。若是使用了cocos2d等其余框架,则有另一套命名规则。

1三、对于常见的EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION,错误,通常都是由于访问已经被release的对象形成的。尤为是在一个线程中访问另一个线程的autorelease库中的对象,尤为要注意此类问题。
1四、严格遵照iphone 内存管理手册,对于不是由你建立的对象,不要越权release,不然,可能会致使程序crash.有时,一些看起来很是严重的bug,在通过N过次努力,多种思路尝试fix以后,再回头分析bug产生的缘由,你会发现,形成这个严重bug的缘由,极可能是你违反了一个众所周知的规则引发的.这个规则你很是清楚,熟悉,但就是在coding的时候,稍不留神违反了它.因而就带来了灾难性后果.
1五、除了面向对象的cocoa外,iphone编程不要忘记非面向对象的Core Foundation。 面向对象库里不少没有的功能,能够尝试在Core Foundation里找找。披如:RSA算法,MD5算法,SHA1算法,AES加密算法等,cocoa对象库里并无相应的实现,但在core foundation里,均有相应的实现。
1六、NSString类里没有的字符串编码GBK,GB2312,GB18030等,在CoreFoundation里,能找到相应的编码。创建socket链接,得到输入流和输出流时,也须要使用Core Foundation里的CFNetwork api。等等。
1七、经过设置NSZombieEnabled参数,有很是有效帮助解决内存释放错误。
在消除某个对象时,若是为该对象设置了delegate,则须要先将delegate设成nil,这是一种良好的代码习惯。
1八、在3.0 的Simulator上使用Instruments 检测内存泄漏时,没法看到函数名,只能看到一些地址指针.在3.1,3.1.2,3.1.3的simulator都正常,可以正常地看到是在哪一个函数中存在的内存泄漏.经过Nib文件加载viewcontroller的各类UI控件时时,在viewDidLoad函数里,viewController的控件才能使用。在viewcontroller的构造函数里,nib里的控件都尚未完成连接构造呢。
1九、iPhone程序崩溃不要着急。能够结合使用Console和objc_exception_throw能够快速定位根源所在。

一些好用的框架/组件:

一、 PDColoredProgressView进度条组件,能够设置进度条的颜色,支持iOS4。可是在ASIHttpRequest的下载进度条中很差使用。
二、 MTLabel能够对label中的文字设置行高。
三、 TSAlertView能够在弹出框(UIAlertView)中设置输入框,相似于JavaScript中的prompt 。
四、ZipArchive对文件进行压缩和解压操做。
五、 ASIHTTPRequest数据的上传和下载,以及断点续传。
六、 json-framework文件格式解析。

性能优化

一、 使用xcode自带的 Instruments工具能够查看应用的内存,cpu等资源使用状况。
二、JSON格式解析速度优化。有人分析说 JSONKit 比 json-framework 效率更高。

日志跟踪
一、友盟,比较全面的数据分析工具。
二、 Crashlytics.framework能够记录应用程序崩溃日志,并快速定位到出问题的代码行。

相关面试总结
一、你使用过Objective-C的运行时编程(Runtime Programming)么?

若是使用过,你用它作了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?  

Objecitve-C的重要特性是Runtime(运行时),在#import <objc/runtime.h> 下能看到相关的方法,用过objc_getClass()和class_copyMethodList()获取过私有API;使用  

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. ```objective-c  
  2. Method method1 = class_getInstanceMethod(cls, sel1);  
  3. Method method2 = class_getInstanceMethod(cls, sel2);  
  4. method_exchangeImplementations(method1, method2);    
  5. ```     

代码交换两个方法,在写unit test时使用到。  

二、CG框架的联系是什么?分别用CA和CG作过些什么动画或者图像上的内容。(有须要的话还能够涉及Quartz的一些内容)  

UI框架的底层有CoreAnimation,CoreAnimation的底层有CoreGraphics。    

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. UIKit |   
  2. ------------ |   
  3. Core Animation |   
  4. Core Graphics |  
  5. Graphics Hardware|      
三、是否使用过CoreText或者CoreImage等?

若是使用过,请谈谈你使用CoreText或者CoreImage的体验。

CoreText能够解决复杂文字内容排版问题。CoreImage能够处理图片,为其添加各类效果。体验是很强大,挺复杂的。

四、 NSNotification和KVO的区别和用法是什么?何时应该使用通知,何时应该使用KVO,它们的实现上有什么区别吗?若是用protocol和delegate(或者delegate的Array)来实现相似的功能可能吗?若是可能,会有什么潜在的问题?若是不能,为何?(虽然protocol和delegate这种东西面试已经面烂了…)

NSNotification是通知模式在iOS的实现,KVO的全称是键值观察(Key-value observing),其是基于KVC(key-value coding)的,KVC是一个经过属性名访问属性变量的机制。例如将Module层的变化,通知到多个Controller对象时,可使用NSNotification;若是是只须要观察某个对象的某个属性,可使用KVO。
对于委托模式,在设计模式中是对象适配器模式,其是delegate是指向某个对象的,这是一对一的关系,而在通知模式中,每每是一对多的关系。委托模式,从技术上能够如今改变delegate指向的对象,但不建议这样作,会让人迷惑,若是一个delegate对象不断改变,指向不一样的对象。  

五、 你用过NSOperationQueue么?若是用过或者了解的话,你为何要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和相似的地方(提示:能够从二者的实现机制和适用范围来描述)。

使用NSOperationQueue用来管理子类化的NSOperation对象,控制其线程并发数目。GCD和NSOperation均可以实现对线程的管理,区别是 NSOperation和NSOperationQueue是多线程的面向对象抽象。项目中使用NSOperation的优势是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具备面向对象的优势(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。

项目中使用GCD的优势是GCD自己很是简单、易用,对于不复杂的多线程操做,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。

六、既然提到GCD,那么问一下在使用GCD以及block时要注意些什么?它们两是一回事儿么?block在ARC中和传统的MRC中的行为和用法有没有什么区别,须要注意些什么?

使用block是要注意,若将block作函数参数时,须要把它放到最后,GCD是Grand Central Dispatch,是一个对线程开源类库,而Block是闭包,是可以读取其余函数内部变量的函数。

七、您是否作过异步的网络处理和通信方面的工做?若是有,能具体介绍一些实现策略么?

使用NSOperation发送异步网络请求,使用NSOperationQueue管理线程数目及优先级,底层是用NSURLConnetion,详细可见开源框架[LWConnetion](https://github.com/xunyn/LWConnetionDemo)。  

八、对于Objective-C,你认为它最大的优势和最大的不足是什么?对于不足之处,如今有没有可用的方法绕过这些不足来实现需求。若是能够的话,你有没有考虑或者实践太重新实现OC的一些功能,若是有,具体会如何作?

最大的优势是它的运行时特性,不足是没有命名空间,对于命名冲突,可使用长命名法或特殊前缀解决,若是是引入的第三方库之间的命名冲突,可使用link命令及flag解决冲突。  

九、简单描述开发中使用的框架? 

 Core Data , Core Graphics, Core Animation,和OpenGLES框架 Foundation、UIKit   

十、是否能够在一个视图控制器中嵌入两个tableview控制器? 

一个视图控制只提供了一个View视图,理论上一个  tableViewController也不能放吧, 只能说能够嵌入一个tableview视图。固然,题目自己也有歧义,若是不是咱们定性

思惟认为的UIViewController, 而是宏观的表示视图控制者,那咱们却是能够把其当作一个视图控制者,它能够控制多个视图控制器,好比TabbarController 那样的感受。   

十一、一个tableView是否能够关联两个不一样的数据源?你会怎么处理?  

首先咱们从代码来看,数据源如何关联上的,实际上是在数据源关联的代理方法里实现的。 所以咱们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据本身的须要去设置如相关的数据源。 所以,我以为能够设置多个数据源啊,可是有个问题是,你这是想干吗呢?想让列表如何显示,不一样的数据源分区块显示?  

十二、tableView的重用机制?  

UITableView经过重用单元格来达到节省内存的目的:经过为每一个单元格指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,以及当单元格滚出屏幕时,容许恢复单元格以便重用.对于不一样种类的单元格使用不一样的ID,对于简单的表格,一个标识符就够了.  假如一个TableView中有10个单元格,可是屏幕上最多能显示4个,那么实际上iPhone只是为其分配了4个单元格的内存,没有分配10个,当滚动单元格时,屏幕内显示的单元格重复使用这4个内存   

1三、 viewcontroller的一些方法的说明viewDidLoad, viewWillDisappear, viewWillAppear方法的 顺序和 做用? 

viewDidLoad:在视图加载后被调用   viewWillAppear:视图即将可见时调用。默认状况下不执行任何操做 

viewDidAppear: 视图已彻底过渡到屏幕上时调用  viewWillDisappear:视图被驳回时调用,覆盖或以其余方式隐藏。默认状况下不执行任何操做  viewDidDisappear:视图被驳回后调用,覆盖或以其余方式隐藏。默认状况下不执行任何操做  先执行viewDidLoad再执行viewWillAppear。    

1四、如何实现延迟加载图片?以及加载图片出现的超时问题? 

常常咱们会用tableView显示不少条目, 有时候须要显示图片, 可是一次从服务器上取来全部图片对用户来浪费流量, 对服务器也是负担.最好是按需加载,即当该用户要浏览该条目时再去加载它的图片。  重写以下方法 

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRow AtIndexPath:(NSIndexPath *)indexPath     
  2.       
  3.     UIImage *image = [self getImageForCellAtIndexPath:indexPath];  //从网上取得图片     
  4.    [cell.imageView setImage:image];     
  5. }    


这虽然解决了延时加载的问题, 但当网速很慢, 或者图片很大时(假设,虽然通常cell中的图很小),你会发现程序可能会失去对用户的响应. 
缘由是  

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. UIImage *image = [self getImageForCellAtIndexPath:indexPath];      


这个方法可能要花费大量的时间,主线程要处理这个method. 因此失去了对用户的响应. 因此要将该方法提出来:  

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. - (void)updateImageForCellAtIndexPath:(NSIndexPath *)indexPath     
  2. {      
  3.    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];     
  4.     UIImage *image = [self getImageForCellAtIndexPath:indexPath];      
  5.     UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];      
  6.     [cell.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image wai tUntilDone:NO];     
  7.     [pool release];     
  8. }     


而后再新开一个线程去作这件事情  

[java]  view plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRow AtIndexPath:(NSIndexPath *)indexPath     
  2. {      
  3.    [NSThread detachNewThreadSelector:@selector(updateImageForCellAtIndexPath:) toTarget: self withObject:indexPath];     
  4. }    

同理当咱们须要长时间的计算时,也要新开一个线程 去作这个计算以免程序处于假死状态  以上代码只是示例, 还能够改进的更多, 好比从网上down下来一次后就将图片缓存起来,再次显示的时候就不用去下载。    

1四、Object-c的类能够多重继承么?能够实现多个接口么?重写一个类的方式用继承好仍是分类好?为何? 

Objective-c只支持单继承,若是要实现多继承的话,能够经过类别和协议的方式来实现,cocoa 中全部的类都是NSObject 的子类,多继承在这里是用protocol 委托代理 来实现的。  

1五、简单描述一下ios的内存管理机制?有没有垃圾回收机制?与java有什么区别? 

 Objective-C的对象在使用完成以后不会自动销毁,须要执行dealloc来释放空间(销毁),不然内存泄露。谁建立,谁释放(相似于“谁污染,谁治理”)。若是你经过alloc、new或copy来建立一个对象,那么你必须调用release或autorelease。换句话说,不是你建立的,就不用你去释放。   

1六、 简单描述一下多线程,以及如何处理ios多线程开发?什么状况下会使用多线程?优势?  

存放NSOperation的集合类。 操做和操做队列,基本能够当作java中的线程和线程池的概念。用于处理ios多线程开发的问题。 网上部分资料提到一点是,虽然是queue,可是却并非带有队列的概念,放入的操做并不是是按照严格的先进现出。 这边又有个疑点是,对于队列来讲,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的, 可是Bfunc是等Afunc彻底操做完之后,B才开始启动而且执行,所以队列的概念离乱上有点违背了多线程处理这个概念。 可是转念一想其实能够参考银行的取票和叫号系统。 所以对于A比B先排队取票可是B率先执行完操做,咱们亦然能够感性认为这仍是一个队列。 可是后来看到一票关于这操做队列话题的文章,其中有一句提到 “由于两个操做提交的时间间隔很近,线程池中的线程,谁先启动是不定的。” 瞬间以为这个queue名字有点忽悠人了,还不如pool~ 综合一点,咱们知道他能够比较大的用处在于能够帮组多线程编程就行了。   

1七、asihttp代码原理,异步请求的原理,异步请求最大数目,为何只能这么多? 

ASIHTTPRequest是一个简易使用的类库,经过包装CFNetwork API 来简化 和服务器端的通信. 它编写的语言是Objective-C 可以应用于Mac OS X and iPhone 平台的应用程序.   异步: 请求经过事件触发->服务器处理(这是浏览器仍然能够做其余事情)->处理完毕   这个数量是跟cpu有关的,并发性取决于cpu核数,每一个核只能同时处理一个任务.4核cpu理论上能够并发处理4个任务,若是按http来算就是4个请求,可是cpu是抢占式资源,因此通常来讲并发量是要根据任务的耗时和cpu的繁忙度来计算4个左右只是个经验值你开10个短耗时的任务和几个长耗时任务的效率是不一样的。   

1八、 什么是懒汉模式(懒加载)?何时使用?好处是什么?  

懒汉模式,只在用到的时候才去初始化。 也能够理解成延时加载。 我以为最好也最简单的一个列子就是tableView中图片的加载显示了。 一个延时载,避免内存太高,一个异步加载,避免线程堵塞。   

1九、ios平台怎么作数据的持久化?coredata和sqlited 的联系?coredata是一个关系型数据库吗?

 iOS中能够有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data;core data可使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。core data提供了基础结构去处理经常使用的功能,例如保存,恢复,撤销和重作,容许你在app中继续建立新的任务。在使用core data的时候,你不用安装额外的数据库系统,由于core data使用内置的sqlite数据库。core data将你app的模型层放入到一组定义在内存中的数据对象。core data会追踪这些对象的改变,同时能够根据须要作相反的改变,例如用户执行撤销命令。当core data在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。   mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。能够在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与core data框架不一样的是,sqlite是使用程序式的,sql的主要的API来直接操做数据表。   

20、什么是PUSH(推送消息)? 在什么状况下使用,使用过哪些推送?百度云推送? 

第 一阶段:BeejiveIM服务器把要发送的消息、目的iPhone的标识打包,发 给APNS。    

第二阶段:APNS在自身的已注册Push服务 的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。   

第三阶段:iPhone把发来的消息传递给相应的应用程序, 而且按照设定弹出Push通知。

相关文章
相关标签/搜索