年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1794|回复: 0

深入理解iPhone OS/SDK与Objective-C 2.0

[复制链接]
  • TA的每日心情
    倒霉
    2020-11-28 20:31
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2014-10-16 10:13:27 | 显示全部楼层 |阅读模式
    工欲善其事,必先利其器。在开发iPhone应用程序的时候,深入理解iPhone OS/SDK与Objective-C 2.0是很重要的。
    iPhone OS
    iPhone OS 由4个主要部分组成。下面简单地罗列一下它们的功能。

    Cocoa Touch

    • 窗口和视图
    • 事件管理
    • 用户接口
    • 加速传感器
    • 照相机

    Media

    • Core Graphics(2维图形接口)
    • Core Animation(动画)
    • OpenGL
    • Core Audio(声音)
    • OpenAL
    • Media Player(MPEG4,MP3)

    Core Services

    • Address Book
    • Core Foundation
    • Core Location
    • CFNetwork(http,https,ftp,SSL,TLS)
    • 网络安全
    • SQLite(SQL数据库)
    • XML

    Core OS

    • 多线程
    • 网络应用(BSD套接字)
    • 文件系统
    • Bonjour(利用无线网络连接其他机器)

    iPhone SDK
    iPhone SDK 中主要包含下列4个工具。

    • Xcode - 项目管理、代码编辑、编译、调试(IDE)
    • Interface Builder - GUI 设计
    • iPhone Simulator - 模拟器
    • Instrument - 性能测试、调整
    实际开发的过程中,基本上是在使用 Xcode 与 Interface Builder 来进行的。调试则是使用模拟器或者实际设备。要注意的是在PC上模拟程序,由于PC的主频,性能高于实际设备,所以不能只在模拟器上调试。除此之外,一些类,功能在模拟器上也是不能使用的,比如 NSDateCalendar 类,或者是照相机功能。

    Objective-C 2.0内存管理
    虽然 Objective-C 2.0 已经支持了垃圾收集了,但是 iPhone OS 中却不能使用它。所以我们需要自己来管理内存。Objective-C 的内存管理方式与使用引用计数的方式,就是说对象有一个计数器,引用对象一次,计数器加一,当计数器为0的时候,该对象的内存被释放。
    创建对象实例的时候(init,alloc)应用计数加一,执行过程中,别的对象如果需要该对象,需要用(retain)来引用它,这时,该对象的应用计数器加一。不需要对象的时候用(release)来释放,这时引用计数器减一,当计数器为0的时候,释放该对象内存。

    • init,alloc - 计数器 +1
    • retain - 计数器 +1
    • release - 计数器 -1
    另外如果不使用 retain,release,可以使用(autorelease)来自动释放对象。

    容器
    Objective-C 中的容器主要有以下3种:

    • 数组
    • 字典
    • Set
    向容器中添加的内容不能直接用 int 或 float,需要通过 NSNumber 等封装类来实现。Objective-C 2.0 开始可以使用迭代子(Enumerator),来顺序访问容器中的元素。

    Notification
    Notification是消息通知的功能。具体使用 NSNotificationCenter 类。将需要接受通知的对象,方法,事件注册到该类上。

    归档(Archive)
    归档是指将对象的内存布局原样地保存到文件系统上。同样对应的由文件中的数据生成对象叫做UnAchive。在 iPhone SDK 中使用 NSKeyedArchiver 和 NSKeyedUnarchiver 类来实现。
    一般在程序结束的时候,保存当前的状态,再次启动的时候UnAchive一下,就又回到了刚才退出时的状态。下面是一个例子:
    1. // MyKeyedArchiver.h
    2. #import <Cocoa/Cocoa.h>
    3. @interface NSKeyedArchiver (MyKeyedArchiver)
    4. - (void)encodeValueOfObjCType:(const char *)valueType at:(const void *)address;
    5. @end
    复制代码
    1. #import "MyKeyedArchiver.h"
    2. @implementation NSKeyedArchiver (MyKeyedArchiver)
    3. - (void)encodeValueOfObjCType:(const char *)valueType at:(const void *)address
    4. {
    5.     NSMutableData *datas = [NSMutableData data];
    6.     NSArchiver *arch = [[NSArchiver alloc] initForWritingWithMutableData:datas];
    7.     [arch encodeValueOfObjCType:valueType
    8.                              at:address];
    9.     [self encodeObject:[NSData dataWithData:datas]];
    10.     [arch release];
    11. }
    12. @end
    复制代码
    1. // MyKeyedUnarchiver.h
    2. #import <Cocoa/Cocoa.h>
    3. @interface NSKeyedUnarchiver (MyKeyedUnarchiver)
    4. - (void)decodeValueOfObjCType:(const char *)valueType at:(void *)data;
    5. @end
    复制代码
    1. #import "MyKeyedUnarchiver.h"
    2. @implementation NSKeyedUnarchiver (MyKeyedUnarchiver)
    3. - (void)decodeValueOfObjCType:(const char *)valueType at:(void *)data
    4. {
    5.     NSData *datas = [self decodeObject];
    6.     NSUnarchiver *unarch = [[NSUnarchiver alloc] initForReadingWithData:datas];
    7.     [unarch decodeValueOfObjCType:valueType at:data];
    8.     [unarch release];
    9. }
    10. @end
    复制代码
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-5-7 18:39 , Processed in 0.049004 second(s), 22 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表