《IOS编程》 读后总结

一、视图控制对象
1.
 UIView子类都会实现drawRect:方法,其中包含和绘制视图有关的代码。每次绘制UIView实例时,系统会为视图专门准备一个绘图上下文( CGContextRef context = UIGraphicsGetCurrentContext() )。接着系统会激活该上下文,然后向需要回执的UIView对象发送drawRect:消息。注意:只能在drawRect:方法中调用绘图方法或函数。除了drawRect:方法,无法从其他地方获得激活状态的CGContextRef.也就无法调用灰土方法或函数。
2.
UIScrollView : 为了让用户能够滚动视图,可以将视图设置为UIScrollView的子视图,主要涉及它的setContentSize方法。要实现缩放功能,则需要为UIScrollView设置委托对象UIScrollViewDelegate协议并使用setMinimumZoomScale,setMaximumZoomScale方法来启用缩放功能,且要实现viewForZoomingInScrollView:(该方法返回UIScrollView对象需要缩放的视图)。
3.
隐藏状态条:[UIApplication shareApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
4.
UITabBarController : 负责视图的交换工作,使用时可能涉及到的方法是setViewControllers:,给该方法传入每个Tab对应的ViewController数组。(每个视图控制对象都有一个类型为UITabBarItem的实例变量,负责标签条上显示的文字和图标)。
5.
UIWindow实现了一个名为setRootViewController:的方法,将UIViewController实例作为参数传入该方法,传入的视图控制对象的视图会自动加入该窗口,成为窗口的子视图并调整大小和窗口保持一致。窗口对象也会保留它的根视图对象。
6.
载入XIB文件:创建UIViewController子类实例时,通过指定初始化方法 initWithNibName:bundle: 传入XIB的文件名。当视图控制对象需要使用实例变量view的时候,会查看应用程序包内是否存在相应名称的XIB文件(如果传入的名称是nil,那么UIViewController对象会查找和这个UIViewController子类的类名匹配的XIB文件)。
7.
视图控制对象也是通过alloc和init创建的,但是视图控制对象只有在真正需要视图是,才会通过调用loadView来创建,这种做法能够提高内存使用效率。




二、UITableView  UITableViewController  UITableViewCell对象
1. 
使用UITableView时必须要指定它的数据源,该数据源必须遵守 UITableViewDataSource 协议 ,同时也要为 UItableView 对象设置 UITableViewDelegate 委托, UITableViewController 可以作为 UITableView的数据源、视图控制对象和委托对象。
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对象就会进入编辑模式。


三、 UINavigationController 导航控制器
1.
UITabBarController对象可以切换没有相互依存关系的情况的视图,并且必须在初始化时设置好所有的视图控制对象,但如果屏幕键互有关联,就要使用导航控制对象。
2.
使用 UINavigationController显示多个屏幕的信息时,他会以栈的形式保存所有的屏幕,这里的栈其实是NSArray对象,通过发送viewController消息可以得到整个栈(返回一个NSArray对象),也可以使用push和pop两种方法的推入和推出视图。
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来取消第一响应状态。




四、相机
1.
UIImageView对象会根据contentMode属性显示图片,该属性决定图片在frame中的显示位置和缩放模式,默认值是UIViewContentModeCenter(即根据UIImageView对象的bounds居中显示图片,没有缩放),此外还有属性UIViewContentModeScaleToFill/AspectFit/AspectFill等.
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])。
4.
在弹出照片选择的视图的时候,我们会用到当前视图控制器的presentModalViewController:animated:方法以模态的形式显示视图,关闭时也需要用到dismissModalViewControllerAnimated:方法。
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).
代码示例:
CFUUIDRef newUniqueID = CFUUIDCreate(kCFAllocatorDefault);
CFUUIDRef newUniqueIDString = CFUUIDCreateString(kCFAllocatorDefault, newUniqueID);
使用完毕后要释放对象(当C函数的函数名包含英文单词Create时,条用房需要负责释放返回对象):CFRelease(newUniqueID); CFRelease(newUniqueIDString);
6.
取消点击textField出现的键盘:[textField resignFirstResponder]; //取消第一响应对象状态




五、UIPopoverController(针对iPad)与模态视图控制对象
1.
前面了解到,现在有四种显示视图控制对象的方法:
设置UIWindow实例的跟视图控制对象、压入UINavigationController栈,加入UITabBarController对象和以模态形式显示。
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可以来设置过渡动画。




六、保存、读取与多任务处理
1.
应用沙盒(Application Sandbox):就是应用的文件系统目录。应用沙盒包含以下几个目录:
* 应用程序包(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实例本身就是一个数据容器,可以存放对象和对象的数据。
* NSCoding协议两个必须实现的方法:encodeWithCoder:(固化用)和initWithCoder:(解固用)。
* 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 对象。




七、通告机制与设备转动
1.
* 每个应用都有一个 NSNotificationCenter 实例,通过defaultCenter消息获得。使用通知中心实例的 addObserver:selector:name:object:方法可以将指定对象注册为观察器,由通告触发的方法会带一个参数,该参数是一个NSNotification对象,有三个属性:object,name,userInfo(NSDictionary对象)。
* 发送通告:[[NSNotificationCenter defaultCenter] postNotification: NSNotification实例];
* 通告中心不会保留观察器,在通告中心注册过的对象,必须在释放前取消注册。否则,当响应的通告再次出现时,通告中心仍然会向该观察器发送消息,因为相应的对象已经释放了,所以会导致应用崩溃。
2.
UIDevice 对象会不间断地发送通告。以下是UIDevice 对象所发通告的名称常量。
UIDevice Orientation/BatteryState/BatteryLevel/ProximityState DidChangeNotification .




八、Core Data
1.
* 要将数据保存在本地服务器中,可以使用固化或者CoreData。固化最大的缺点是数据必须整存整取,要访问固化文件中的任何数据,必须解固整个文件,要更新数据的任何变动,必须重写整个文件。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 对象,返回符合指定条件的对象。此外,这个对象还可以用于数组的过滤。
4.
#pragma mark 常用来为方法分组,编译器会忽略这种标识,但是Xcode能够识别这种宏,它使方法的查看更加快速方便。






九、NSUserDefaults
1.
每个应用都有一个 NSUserDefaults 实例。向 NSUserDefaults 类发送 standardUserDefaults 消息可以得到该实例,它类似于 NSMutableDictionary,可以通过键存取或者删除对象。当应用第一次使用 NSUserDefaults 实例时,会自动从文件读取;修改数据后, NSUserDefaults 实例会自动将数据写入文件。NSUserDefaults 的键必须是字符串类型,值必须是可序列化的对象。
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设置的时长,每隔一段时间报告方向感应器的数据变化。
4.
要侦测用户摇动设备的动作,需要在加速感应器传出的信号上执行一些复杂的数学运算,不过UIResponder类所实现的方法可以替我们完成这些计算工作。motionBegan:withEvent: 和 motionEnded:withEvent: 和 motionCancelled:withEvent: 。











































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值