标签:
iPhone OS(现在所谓的iOS)这是iPhone, iPod touch 和 iPad 设备的操作系统。
1、Core OS:
它是用FreeBSD和Mach所改写的Darwin, 是开源、符合POSIX标准的一个Unix核心。这一层包括或者说是提供了整个iPhone OS的一些基础功能,比方:硬件驱动, 内存管理。程序管理,线程管理(POSIX)。文件系统,网络(BSD Socket),以及标准输入输出等等。全部这些功能都会通过C语言的API来提供。
另外,值得一题的是,这一层最具有UNIX色彩,假设你须要把 UNIX上所开发的程序移植到iPhone上,多半都会使用到Core OS的API.
核心OS层的驱动也提供了硬件和系统框架之间的接口。然而,由于安全的考虑,仅仅有有限的系统框架类能訪问内核和驱动。
iPhone OS提供了很多訪问操作系统低层功能的接口集,iPhone 应用通过LibSystem库来訪问这些功能,这些接口集例如以下所看到的:
线程(POSIX线程)
网络(BSD sockets)
文件系统訪问
标准I/O
Bonjour和DNS服务
现场信息(Locale Information)
内存分配
数学计算
很多Core OS技术的头文件位于文件夹<iPhoneSDK>/usr/include/,iPhoneSDK是SDK的安装文件夹。
2、Core Services:
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和HTTPserver的通信,或解析DNS等任务。
使用CFNetwork框架实现的任务例如以下所看到的:
BSD Sockets;
利用SSL或TLS创建加密连接。
解析DNS Hosts;
解析HTTP协议,鉴别HTTP和HTTPSserver;
在FTPserver工作;
公布、解析和浏览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,而不须要在远端运行还有一个数据库server。
开发人员能够创建本地数据库文件。并管理这些 文件里的表格和记录。
数据库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安装的目标文件夹。
3、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语言的。它採用基于对象的抽象表征基础绘图对象,使得图像内easy于保存和复用。
② 核心动画(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等。
接着系统会激活该上下文,然后向须要回执的UIView对象发送drawRect:消息。
注意:仅仅能在drawRect:方法中调用绘图方法或函数。
除了drawRect:方法,无法从其它地方获得激活状态的CGContextRef.也就无法调用灰土方法或函数。
要实现缩放功能。则须要为UIScrollView设置托付对象UIScrollViewDelegate协议并使用setMinimumZoomScale,setMaximumZoomScale方法来启用缩放功能,且要实现viewForZoomingInScrollView:(该方法返回UIScrollView对象须要缩放的视图)。
创建UIViewController子类实例时,通过指定初始化方法 initWithNibName:bundle: 传入XIB的文件名称。当视图控制对象须要使用实例变量view的时候,会查看应用程序包内是否存在对应名称的XIB文件(假设传入的名称是nil,那么UIViewController对象会查找和这个UIViewController子类的类名匹配的XIB文件)。
2、几个关于UITableVIewController的重要方法:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; //返回table中section的个数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section //返回每一个Section的行数
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath //详细行
3、UITableViewCell是UIView的子类。
UITableViewCell对象也有自己的子视图:contentView,真正负责显示UITableViewCell的是contentView下的另外三个子视图,各自是:textLabel detailTextLabel imageView. UITableViewCell还有一个UITableViewCellStyle属性。用于决定使用那些子视图以及这些子视图在contentView中的位置。
4、重用UITableViewCell对象。由于IOS设备内存有限,所以必须採用重用UITableViewCell对象的机制。即当用户滚动表格是,部分UITableViewCell对象会移出窗体,我们把移出的UITableViewCell对象放入UITableViewCell对象池。等待重用。每一个UITableViewCell对象都有一个 reuseIdentifier 属性,类型为NSString。通过想表格视图传入特定的NSString对象,数据源就能够查询并获取一个可重用的UITableViewCell对象。例如以下列代码是获取可重用对象:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
5、UITableView对象有一个editing属性,设置为YES时。UITableView对象就会进入编辑模式。
3、UIViewController对象有一个navigationItem属性,类型为UINavigationItem.和UINavigationBar不同。UINavigationItem不是UIView的子类,不能在屏幕上显示,但 UINavigationItem 能够为 UINavigationBar对象提供绘图所需的内容。当某个UIViewController对象成为UINavigationController的栈顶对象时,UINavigationBar对象会使用UIViewController对象的navigationItem并设置对应的属性。
UINavigationItem能够包括leftBarButtonItem rightBarButtonItem titleView三个能够自己定义的部分。
4、SEL的数据类型是指针,指向选择器(selector)。选择器是方法的唯一标识。将方法名传给 @selector() 指令,能够得到指向对应方法的SEL(@selector不会检查对应的方法是否存在)。
5、UIView实例存在一个endEditing:消息,当视图收到该消息时,假设视图是当前的第一对应对象,就会取消自己的第一响应对象状态,而且虚拟键盘也会消失(传入的參数代表是否须要强制取消第一响应对象状态,YES代表强制退出), textField也能够通过resignFirstResponder来取消第一响应状态。
2、UIToolbar对象和UINavigationBar相似,差别是UINavigationBar仅仅能有两个UIBarButtonItem对象。而UIToolbar能够有一组UIBarButtonItem对象。
3、启用相机拍照功能须要用到UIImagePickerController实例。而且必须设定事实上例属性sourceType并设置托付对象(UIImagePickerControllerDelegate),此外。由于UIImagePickerController是UINavigationController的子类,所以也须要遵守UINavigationControllerDelegate协议。
sourceType有三种 :UIImagePickerControllerSourceTypeCamera:用户将拍摄一张新照片。 UIImagePickerControllerSourceTypePhotoLibrary:显示界面,让用户选择相冊,然后从该相冊选择一张照片。UIImagePickerControllerSourceTypeSavedPhotosAlbum:让用户从近期拍摄的照片里选择一张照片。 选中照片时会触发UIImagePickerControllerDelegate下的imagePickerController:didFinishPickingMediaWithInfo:消息,通过该消息能够获取选择的图片对象(UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage])。
5、 类型为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).6、取消点击textField出现的键盘:[textField resignFirstResponder]; //取消第一响应对象状态
2、UIViewController对象会在运行时自己主动依据当前的设备载入不同的XIB文件。
UIViewController对象拥有一个nibName属性,创建该对象时,须要通过初始化方法为这个nibName属性赋值(假设传入nil,就等同于将这个类的类名设置为nibName属性)。
当视图控制对象须要载入视图时。会载入和nibName匹配的XIB文件。假设应用是在iPad上运行的,就会先查找并载入后缀为~ipad的XIB文件。
3、推断设备类型:通过UIDevice类发送currentDevice方法。能够得到UIDevice对象,然后检查该对象的userInterfaceIdiom属性,该属性仅仅有两种值:UIUserInterfaceIdiomPad 和 UIUserInterfaceIdiomPhone.
4、UIPopoverController对象能够在一个带边框的窗体中显示还有一个视图控制对象的视图。方法是将“还有一个”视图控制对象设置为该对象的 contentViewController.(注意:在iPad中使用UIImagePickerController对象时,必须借助UIPopoverController对象才干正确显示)。同一时候须要遵守UIPopoverControllerDelegate协议。
5、每一个视图控制对象都有一个名为 modalViewController 和一个名为 parentViewController 的属性。分别用于存储模态显示状态下对应的子视图和父视图对象。
6、模态视图控制对象的样式:iPhone中的模态视图控制对象会占领整个窗体。对于iPhone。这是默认也是唯一的样式选择。对于iPad则有两种额外的选项:表单样式(form sheet)和页单样式(page sheet),可通过modalPresentationStyle属性来设置。modalTransitionStyle能够来设置过渡动画。
应用沙盒包括以下几个文件夹:
* 应用程序包(application bundle):包括全部的资源文件和可运行文件,而且是仅仅读文件夹。 * Library/Preferences/:存放全部的偏好设置。通过NSUserDefaults类来存取,iTunes会在同步设备是备份该文件夹。 * tmp/:用于保存应用运行时所需的暂时数据。通过函数NSTemporaryDirectory能够得到应用沙盒下tmp文件夹的全路径。* Documents/:保存应用运行时生成的须要保留的数据。iTunes同步设备室会备份该文件夹。 * Libraty/Caches/:保存应用运行是生成的须要保留的数据,iTunes不会在同步设备是备份该文件夹。
2、获取文件路径:NSSearchPathForDirectoriesInDomains:返回NSArray对象,但在iPhone上仅仅有一个Document文件夹,所以直接取第一个即可了。还能够通过NSHomeDirectory函数得到应用程序根路径,然后把Documents文件夹拼到根路径后面:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"],从而得到全路径。
3、 固化(archiving)是将单个或多个对象从内存写入文件系统的过程。
解固(unarchiving)则是从文件读取对象并写回内存。
仅仅有遵守NSCoding协议的对象才干够固化。固化的实际通过须要通过NSCoder实例来完毕,NSCoder实例本身就是一个数据容器。能够存放对象和对象的数据。
NSKeyedArchiver的类方法archiveRootObject:toFile:能够将遵守NSCoding协议的对象写入文件,而且须要在encodeWithCoder:方法中再实现详细固化代码(使用NSCoder的encodeObject:forKey:方法)。
NSKeyedUnarchiver的类方法unarchiveObjectWithFile:来解码固化后的对象,而且须要在initWithCoder:方法中再实现详细解固代码(使用NSCoder的decodeObjectForKey:)。
4、应用程序的几种状态:未运行、激活、未激活、后台运行、挂起状态(暂停).
5、在Object—C中,能够通过NSData创建、维护和释放内存缓冲区,保存一定数量的二进制数据。使用NSData的writeToFile:方法,能够将转化为NSData类型的数据写入到本地文件里去。使用NSFileManager的defaultManager实例的removeItemAtPath:方法来删除文件。
UIImageJPEGRepresentation函数将会将一个UIImage对象压缩并返回为 NSData 对象。
使用通知中心实例的 addObserver:selector:name:object:方法能够将指定对象注冊为观察器,由通告触发的方法会带一个參数。该參数是一个NSNotification对象,有三个属性:object。name。userInfo(NSDictionary对象)。
发送通告:[[NSNotificationCenter defaultCenter] postNotification: NSNotification实例]。
通告中心不会保留观察器。在通告中心注冊过的对象,必须在释放前取消注冊。
否则,当响应的通告再次出现时。通告中心仍然会向该观察器发送消息,由于对应的对象已经释放了。所以会导致应用崩溃。
2、UIDevice 对象会不间断地发送通告。以下是UIDevice 对象所发通告的名称常量。
UIDevice Orientation/BatteryState/BatteryLevel/ProximityState DidChangeNotification .固化最大的缺点是数据必须整存整取,要訪问固化文件里的不论什么数据,必须解固整个文件,要更新数据的不论什么变动,必须重写整个文件。Core Data没有这样的缺点。弱国须要在文件系统和RAM之间传送大量模型对象。那么CoreData这样的增量读取、更新、删除和插入的特性能够大幅提高应用的性能。
Core Data框架提供的是对象关系映射(ORM)模型,即能够将Objective-C对象转化为数据,以保存在SQLLite数据库文件里,也可将保存后的数据还原成Objective-C对象。
2、通过 CoreData 取回的对象,默认情况下都是 NSManagedObject 实例。NSManagedObject是NSObject的子类,也是CoreData的重要组成部分,它相似于字典对象,能够存取随意的键值对。即NSManagedObject对象会为全部的实体属性保存响应的键值对。
假设须要在创建 NSManagedObject 对象后做一些额外的工作,就应该覆盖 awakeFromFetch 方法,而不是init方法,此外,该对象的 setPrimitiveValue:forKey: 方法能够为指定的属性设置值。还有 awakeFromInsert 方法。
3、NSManagedObjectContext 对象:负责应用和数据库之间的交互,通过 NSManagedObjectContext 对象的 NSPersistentStoreCoordinator 对象,能够指定文件路径并打开响应的 SQLite 数据库。 而 NSPersistentStoreCoordinator 对象须要使用一个 NSManagedObjectModed 实例,这个实例代表某个 CoreData 模型文件。
要通过 NSManagedObjectContext 实例得到这些对象。就必须设置并运行 NSFetchRequest 对象,而 NSFetchRequest 对象还须要一个实体描写叙述对象 NSEntityDescription 来详细定义所要创建或取回的实体类型。还能够通过为 NSFetchRequest 对象添加 NSPredicate 对象,返回符合指定条件的对象。
此外,这个对象还能够用于数组的过滤。
2、偏好设置键的经常使用命名规定:应用名 + 偏好设置名 + 单词prefKey
1、方向感应器通过跟踪作用在其X,Y,Z轴上的重力,侦測设备所处的方向。通过方向感应器返回的数据,还能够侦測设备运动速度的变化。
2、UIAccelerometer加速计是用来检測iphone手机在x y z轴三个轴上加速度的共享API对象,UIAcceleration是表示加速度的类,它包括了来自加速计UIAccelerate的全部数据,有三个属性值:x y z.iphone的加速计支持最高一每秒一百次的频率进行轮询。
3、要获取方向感应器的数据。首先要得到应用的 UIAccelerometer 实例(共享实例sharedAccelerometer),然后设置该对象的实例变量 updateInterval 和 delegate,即UIAccelerometerDelegate托付。对应的托付对象须要实现 accelerometer:didAccelerate: 方法,通过传入 accelerometer:didAccelerate: 方法的 UIAccelerometer对象 和 UIAcceleration对象,该方法能够依据updateInterval设置的时长,每隔一段时间报告方向感应器的数据变化。
motionBegan:withEvent: 和 motionEnded:withEvent: 和 motionCancelled:withEvent: 。
http://lily:123456@www.google.com/search?hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page
URL组成1: absoluteString: http://lily:123456@www.google.co ... =f&oq=&aqi=g10#page absoluteURL: http://lily:123456@www.google.co ... =f&oq=&aqi=g10#page baseURL - 假设在构造URL对象时没有指定,则为nil fragment: page host: www.google.com URL组成2: port: 80,假设没有指定,则为nil path: /search query: hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10 relativePath: /search relativeString: http://lily:123456@www.google.com:80/search?2、NSURLRequest:hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page URL组成3: user: lily password: 123456 scheme: http 怎样构造一个url ? + (id)URLWithString:(NSString *)URLString ? + (id)URLWithString:(NSString *)URLString relativeToURL: (NSURL *)baseURL ? + (id)fileURLWithPath:(NSString *)path isDirectory: (BOOL)isDir ? + (id)fileURLWithPath:(NSString *)path ---------------------------------------------------------- ? - (id)initWithScheme:(NSString *)scheme host:(NSString *)host path:(NSString *)path ? - (id)initWithString:(NSString *)URLString ? - (id)initWithString:(NSString *)URLString relativeToURL:(NSURL *)baseURL ? - (id)initFileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir ? - (id)initFileURLWithPath:(NSString *)path
? + (id)requestWithURL:(NSURL *)theURL ? + (id)requestWithURL:(NSURL *)theURL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInter val)timeoutInterval ? - (id)initWithURL:(NSURL *)theURL ? - (id)initWithURL:(NSURL *)theURL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInter val)timeoutInterval 支持的缓存策略: NSURLRequestUseProtocolCachePolicy NSURLRequestReloadIgnoringLocalCacheData NSURLRequestReloadIgnoringLocalAndRemoteCacheData NSURLRequestReloadIgnoringCacheData NSURLRequestReturnCacheDataElseLoad NSURLRequestReturnCacheDataDontLoad NSURLRequestReloadRevalidatingCacheData可改动的URL请求
3、NSURLConnection
同步请求:? + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error? 最快捷的方式
? - (id)initWithData:(NSData *)data encoding: (NSStringEncoding)encoding
1) NSURLResponse
响应的处理:? NSURLRequest对应的响应的元信息封装在NSURLResponse中 ? - (long long)expectedContentLength ? - (NSString *)suggestedFilename ? - (NSString *)MIMEType ? - (NSString *)textEncodingName ? - (NSURL *)URL
2) NSError 错误的处理
? 假设请求过程中错误发生,导致请求无法完毕,则 error对象不为nil ? - (NSString *)localizedDescription 异步请求 ? 不影响当前正在进行操作 ? 数据分多次按顺序返回 异步请求步骤: ? 构造连接对象(NSURLConnection) ? 发送请求 ? 使用托付监控数据返回过程 ? 将多次返回的数据连接成同一个数据对象 ? 使用连接后的数据对象 构造连接 ? + (NSURLConnection *)connectionWithRequest: (NSURLRequest *)request delegate:(id)delegate ? - (id)initWithRequest:(NSURLRequest *)request delegate: (id)delegate ? - (id)initWithRequest:(NSURLRequest *)request delegate: (id)delegate startImmediately:(BOOL)startImmediately 发送请求 ? - (void)start ? - (void)cancel 使用托付 ? - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data ? - (void)connectionDidFinishLoading:(NSURLConnection *)connection ? - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
? - (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL ? - (void)loadRequest:(NSURLRequest *)request ? - (void)reload ? BOOL detectsPhoneNumbers ? BOOL scalesPageToFit
2、导航栏
在纵向模式下导航栏为44像素高,在横向模式下为32像素高,导航栏提供了一个非常少用的提示模式。该模式将高度扩展了30像素,在纵向模式下为320*74像素,在横向模式下为480*74像素。
3、选项卡 工具栏
选项卡为48像素高,工具栏为44像素高。此两个UI元素通长不用于横向模式。
4、键盘和pickerView
此一般都为横向320*216像素。纵向为480*162像素。
5、UIScreen类
[[UIScreen mainScreen] applicationFrame]通常会依据正在使用的工具栏,状态栏。导航栏来返回可用的区域。
3、 须要为定时器所在的线程设置NSRunLoop,否则定时器可能不会动。
4、 假设在线程中设置了NSRunLoop,须要在销毁线程时也将其停止。使用CFRunLoopStop 。
5、 全部的UI操作都应该在主线程中运行,否则会导致应用崩溃(不一定是马上崩溃)。
6、 假设项目中有c函数,出现同名的函数会导致应用编译失败。即使这些c函数处于不同的页面中。
7、 使用ASIHttpRequest,同步下载过程是不能被取消的,异步下载过程才干够被取消。
8、 应用内支付,支付成功的回调里面,还须要对加密数据transactionReceipt 进行验证。避免越狱的机器使用 IAPFree 等软件伪造数据。
9、 不要试图获取设备的UDID,否则会造成应用审核不通过。能够使用OpenUDID 或者 Mac 地址取代。
10、将比較费时的操作不要放在主线程中运行,避免UI响应慢。
应该在一个新线程中运行(对有同步要求的操作除外)。
11、使用最新的Xcode and iOS SDK进行开发,对高版本号的兼容性会好一些。
比如Mac 10.6下仅仅能安装Xcode4.2and iOS SDK 5.0 ,对iOS 5.1版本号的系统就不能直接调试。
12、 图片命名:比如有一张图片为 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等其它框架,则有另外一套命名规则。
13、对于常见的EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION。错误,一般都是由于訪问已经被release的对象造成的。尤其是在一个线程中訪问另外一个线程的autorelease库中的对象,尤其要注意此类问题。
14、严格遵守iphone 内存管理手冊,对于不是由你创建的对象,不要越权release,否则,可能会导致程序crash.有时,一些看起来非常严重的bug,在经过N过次努力,多种思路尝试fix之后,再回头分析bug产生的原因,你会发现,造成这个严重bug的原因,非常可能是你违反了一个众所周知的规则引起的.这个规则你非常清楚,熟悉,但就是在coding的时候,稍不留神违反了它.于是就带来了灾难性后果.
15、除了面向对象的cocoa外,iphone编程不要忘记非面向对象的Core Foundation。 面向对象库里非常多没有的功能,能够尝试在Core Foundation里找找。披如:RSA算法,MD5算法。SHA1算法。AES加密算法等,cocoa对象库里并没有对应的实现,但在core foundation里,均有对应的实现。
16、NSString类里没有的字符串编码GBK。GB2312。GB18030等,在CoreFoundation里,能找到对应的编码。建立socket连接。获得输入流和输出流时,也须要使用Core Foundation里的CFNetwork api。等等。
17、通过设置NSZombieEnabled參数。有非常有效帮助解决内存释放错误。
在消除某个对象时,假设为该对象设置了delegate,则须要先将delegate设成nil。这是一种良好的代码习惯。
18、在3.0 的Simulator上使用Instruments 检測内存泄漏时,无法看到函数名,仅仅能看到一些地址指针.在3.1,3.1.2,3.1.3的simulator都正常,能够正常地看到是在哪个函数中存在的内存泄漏.通过Nib文件载入viewcontroller的各种UI控件时时,在viewDidLoad函数里。viewController的控件才干使用。
在viewcontroller的构造函数里,nib里的控件都还没有完毕链接构造呢。
19、iPhone程序崩溃不要着急。能够结合使用Console和objc_exception_throw能够高速定位根源所在。
3、 TSAlertView能够在弹出框(UIAlertView)中设置输入框,相似于JavaScript中的prompt 。
4、ZipArchive对文件进行压缩和解压操作。
5、 ASIHTTPRequest数据的上传和下载,以及断点续传。
6、 json-framework文件格式解析。
2、 Crashlytics.framework能够记录应用程序崩溃日志。并高速定位到出问题的代码行。
假设使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?
Objecitve-C的重要特性是Runtime(运行时),在#import <objc/runtime.h> 下能看到相关的方法,用过objc_getClass()和class_copyMethodList()获取过私有API;使用```objective-c Method method1 = class_getInstanceMethod(cls, sel1); Method method2 = class_getInstanceMethod(cls, sel2); method_exchangeImplementations(method1, method2); ```代码交换两个方法,在写unit test时使用到。
(有须要的话还能够涉及Quartz的一些内容) UI框架的底层有CoreAnimation,CoreAnimation的底层有CoreGraphics。
UIKit | ------------ | Core Animation | Core Graphics | Graphics Hardware|
假设使用过,请谈谈你使用CoreText或者CoreImage的体验。
CoreText能够解决复杂文字内容排版问题。CoreImage能够处理图片,为其加入各种效果。体验是非常强大,挺复杂的。
比如将Module层的变化。通知到多个Controller对象时,能够使用NSNotification。假设是仅仅须要观察某个对象的某个属性,能够使用KVO。
对于托付模式,在设计模式中是对象适配器模式。其是delegate是指向某个对象的,这是一对一的关系。而在通知模式中,往往是一对多的关系。托付模式。从技术上能够如今改变delegate指向的对象。但不建议这样做,会让人迷惑,假设一个delegate对象不断改变,指向不同的对象。
项目中使用NSOperation的长处是NSOperation是对线程的高度抽象,在项目中使用它。会使项目的程序结构更好,子类化NSOperation的设计思路。是具有面向对象的长处(复用、封装)。使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
项目中使用GCD的长处是GCD本身非常简单、易用。对于不复杂的多线程操作,会节省代码量,而Block參数的使用,会是代码更为易读,建议在简单项目中使用。
使用block是要注意,若将block做函数參数时,须要把它放到最后,GCD是Grand Central Dispatch,是一个对线程开源类库,而Block是闭包,是能够读取其它函数内部变量的函数。
使用NSOperation发送异步网络请求,使用NSOperationQueue管理线程数目及优先级。底层是用NSURLConnetion,详细可见开源框架[LWConnetion](https://github.com/xunyn/LWConnetionDemo)。
假设能够的话。你有没有考虑或者实践过又一次实现OC的一些功能,假设有,详细会怎样做?最大的长处是它的运行时特性,不足是没有命名空间。对于命名冲突,能够使用长命名法或特殊前缀解决。假设是引入的第三方库之间的命名冲突,能够使用link命令及flag解决冲突。
Core Data , Core Graphics, Core Animation,和OpenGLES框架 Foundation、UIKit
一个视图控制仅仅提供了一个View视图,理论上一个 tableViewController也不能放吧, 仅仅能说能够嵌入一个tableview视图。
当然,题目本身也有歧义,假设不是我们定性
思维觉得的UIViewController。 而是宏观的表示视图控制者。那我们倒是能够把其看成一个视图控制者,它能够控制多个视图控制器,比方TabbarController 那样的感觉。首先我们从代码来看,数据源怎样关联上的,事实上是在数据源关联的代理方法里实现的。 因此我们并不关心怎样去关联他,他怎么关联上。方法仅仅是让我返回依据自己的须要去设置如相关的数据源。
因此。我觉得能够设置多个数据源啊,可是有个问题是,你这是想干嘛呢?想让列表怎样显示。不同的数据源分区块显示?
UITableView通过重用单元格来达到节省内存的目的:通过为每一个单元格指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,以及当单元格滚出屏幕时,同意恢复单元格以便重用.对于不同种类的单元格使用不同的ID,对于简单的表格,一个标识符就够了. 假如一个TableView中有10个单元格,可是屏幕上最多能显示4个,那么实际上iPhone仅仅是为其分配了4个单元格的内存,没有分配10个,当滚动单元格时,屏幕内显示的单元格反复使用这4个内存
viewDidLoad:在视图载入后被调用 viewWillAppear:视图即将可见时调用。默认情况下不运行不论什么操作
viewDidAppear: 视图已全然过渡到屏幕上时调用 viewWillDisappear:视图被驳回时调用。覆盖或以其它方式隐藏。默认情况下不运行不论什么操作 viewDidDisappear:视图被驳回后调用,覆盖或以其它方式隐藏。默认情况下不运行不论什么操作 先运行viewDidLoad再运行viewWillAppear。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRow AtIndexPath:(NSIndexPath *)indexPath { UIImage *image = [self getImageForCellAtIndexPath:indexPath]; //从网上取得图片 [cell.imageView setImage:image]; }
UIImage *image = [self getImageForCellAtIndexPath:indexPath];
- (void)updateImageForCellAtIndexPath:(NSIndexPath *)indexPath { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; UIImage *image = [self getImageForCellAtIndexPath:indexPath]; UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image wai tUntilDone:NO]; [pool release]; }
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRow AtIndexPath:(NSIndexPath *)indexPath { [NSThread detachNewThreadSelector:@selector(updateImageForCellAtIndexPath:) toTarget: self withObject:indexPath]; }同理当我们须要长时间的计算时,也要新开一个线程 去做这个计算以避免程序处于假死状态 以上代码仅仅是演示样例, 还能够改进的很多其它, 比方从网上down下来一次后就将图片缓存起来,再次显示的时候就不用去下载。
Objective-c仅仅支持单继承,假设要实现多继承的话。能够通过类别和协议的方式来实现,cocoa 中全部的类都是NSObject 的子类,多继承在这里是用protocol 托付代理 来实现的。
Objective-C的对象在使用完毕之后不会自己主动销毁。须要运行dealloc来释放空间(销毁)。否则内存泄露。谁创建,谁释放(相似于“谁污染,谁治理”)。假设你通过alloc、new或copy来创建一个对象。那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
存放NSOperation的集合类。 操作和操作队列,基本能够看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。
网上部分资料提到一点是。尽管是queue,可是却并非带有队列的概念,放入的操作并非是依照严格的先进现出。 这边又有个疑点是。对于队列来说,先进先出的概念是Afunc加入进队列,Bfunc紧跟着也进入队列。Afunc先运行这个是必定的, 可是Bfunc是等Afunc全然操作完以后。B才開始启动而且运行。因此队列的概念离乱上有点违背了多线程处理这个概念。 可是转念一想事实上能够參考银行的取票和叫号系统。 因此对于A比B先排队取票可是B领先运行完操作,我们亦然能够感性觉得这还是一个队列。 可是后来看到一票关于这操作队列话题的文章,当中有一句提到 “由于两个操作提交的时间间隔非常近。线程池中的线程,谁先启动是不定的。
” 瞬间觉得这个queue名字有点忽悠人了,还不如pool~ 综合一点,我们知道他能够比較大的用处在于能够帮组多线程编程就好了。
17、asihttp代码原理,异步请求的原理,异步请求最大数目,为什么仅仅能这么多?
ASIHTTPRequest是一个简易使用的类库,通过包装CFNetwork API 来简化 和server端的通讯. 它编写的语言是Objective-C 能够应用于Mac OS X and iPhone 平台的应用程序. 异步: 请求通过事件触发->server处理(这是浏览器仍然能够作其它事情)->处理完毕 这个数量是跟cpu有关的,并发性取决于cpu核数,每一个核仅仅能同一时候处理一个任务.4核cpu理论上能够并发处理4个任务,假设按http来算就是4个请求,可是cpu是抢占式资源,所以一般来说并发量是要依据任务的耗时和cpu的繁忙度来计算4个左右仅仅是个经验值你开10个短耗时的任务和几个长耗时任务的效率是不同的。
懒汉模式。仅仅在用到的时候才去初始化。 也能够理解成延时载入。 我觉得最好也最简单的一个列子就是tableView中图片的载入显示了。 一个延时载。避免内存过高。一个异步载入。避免线程阻塞。
iOS中能够有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data。core data能够使你以图形界面的方式高速的定义app的数据模型,同一时候在你的代码中easy获取到它。
core data提供了基础结构去处理经常使用的功能,比如保存,恢复。撤销和重做。同意你在app中继续创建新的任务。在使用core data的时候。你不用安装额外的数据库系统,由于core data使用内置的sqlite数据库。
core data将你app的模型层放入到一组定义在内存中的数据对象。core data会追踪这些对象的改变,同一时候能够依据须要做相反的改变,比如用户运行撤销命令。当core data在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。 mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎。也非常easy嵌入到应用程序。能够在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。
与core data框架不同的是。sqlite是使用程序式的,sql的基本的API来直接操作数据表。
第 一阶段:BeejiveIMserver把要发送的消息、目的iPhone的标识打包,发 给APNS。
第二阶段:APNS在自身的已注冊Push服务 的iPhone列表中,查找有对应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来该消息发送到相应的应用程序, 并根据该设置弹出Push通知。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/4690701.html