罗朝辉(飘飘白云)

关注嵌入式操作系统,移动平台,图形开发。-->加微博 ^_^

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  85 随笔 :: 0 文章 :: 169 评论 :: 0 Trackbacks

Cocoa 开发

Mac, iPhone/iPad开发相关的东东
     摘要: KVO 并不是什么新事物,换汤不换药,它只是观察者模式在 Objective C 中的一种运用,这是 KVO 的指导思想所在。其他语言实现中也有“KVO”,如 WPF 中的 binding。而在 Objective C 中又是通过强大的 runtime 来实现自动键值观察的。本文对 KVO 的使用以及注意事项,内部实现都详细介绍了一番,对 KVO 的理解又深入一层了。Objective 中的 KVO 虽然可以用,但却非完美,有兴趣的了解朋友请查看《KVO 的缺陷》 以及改良实现 MAKVONotificationCenter 。  阅读全文
posted @ 2012-11-17 17:41 罗朝辉 阅读(21771) | 评论 (4)  编辑

     摘要: 如果我们在 Objective C 中向一个对象发送它无法处理的消息,会出现什么情况呢?根据前文《深入浅出Cocoa之消息》的介绍,我们知道发送消息是通过 objc_send(id, SEL, ...) 来实现的,它会首先在对象的类对象的 cache,method list 以及父类对象的 cache, method list 中依次查找 SEL 对应的 IMP;如果没有找到且实现了动态方法决议机制就会进行决议,如果没有实现动态方法决议机制或决议失败且实现了消息转发机制就会进入消息转发流程,否则程序 crash。也就是说如果同时提供了动态方法决议和消息转发,那么动态方法决议先于消息转发,只有当动态方法决议依然无法正确决议 selector 的实现,才会尝试进行消息转发。在前文中,我并没有详细讲解动态方法决议,因此本文将详细介绍之。  阅读全文
posted @ 2012-11-14 23:53 罗朝辉 阅读(2326) | 评论 (0)  编辑

     摘要: iOS 游戏开发教程资源,来自 http://www.raywenderlich.com  阅读全文
posted @ 2012-11-10 22:45 罗朝辉 阅读(1051) | 评论 (0)  编辑

     摘要: XCode 内置GDB,我们可以在命令行中使用 GDB 命令来调试我们的程序。下面将介绍一些常用的命令以及调试技巧。  阅读全文
posted @ 2012-01-31 16:19 罗朝辉 阅读(3242) | 评论 (0)  编辑

     摘要: 在前文中总结到“ObjC 为每个类的定义生成两个 objc_class ,一个即普通的 class,另一个即 metaclass。我们可以在运行期创建这两个 objc_class 数据结构,然后使用 objc_addClass 动态地创建新的类定义。”今天我们来如何在运行时动态创建类。下面这个函数就是应用前面讲到的Class,MetaClass的概念,在运行时动态创建一个类。  阅读全文
posted @ 2012-01-30 14:05 罗朝辉 阅读(4608) | 评论 (2)  编辑

     摘要: 最近打算写一些ObjC中比较底层的东西,尤其是 runtime 相关的。从哪里入手呢?那当然是最基本的类与对象。与C++相比,ObjC中的类与对象结构要简洁与一致得多(参考《深度探索C++对象模型》,你就知道C++中类与对象结构的复杂)。本文将详细讲解ObjC中类与对象的结构,下回将讲如何在 runtime 时操作类。

总结:ObjC 为每个类的定义生成两个 objc_class ,一个即普通的 class,另一个即 metaclass。我们可以在运行期创建这两个 objc_class 数据结构,然后使用 objc_addClass 动态地创建新的类定义。这个够动态够强大的吧?下回讲演示如何在运行期动态创建新类。  阅读全文
posted @ 2012-01-19 16:58 罗朝辉 阅读(4672) | 评论 (5)  编辑

     摘要: Three20 是 facebook 开源的一款功能齐全又强大的库,覆盖 UI,network,JSON/XML解析等。其 github 仓库在这里:https://github.com/facebook/three20 ,这个页面也有如何在工程中添加 three20 库的介绍,不过在 Lion 系统下以及 xcode 4.2 下有些许不同,英文好的同学可以参看原文。现整理如下:  阅读全文
posted @ 2011-12-31 17:45 罗朝辉 阅读(2759) | 评论 (0)  编辑

     摘要: 使用 OCMock 进行 unit test 时,我们无法使用 stub 或 expect 测试类方法,那么又该怎样测试类方法呢?
下面是一个解决办法:在测试类中的非类方法 wrap 一下类方法,然后测试 wrap 方法。  阅读全文
posted @ 2011-12-27 14:34 罗朝辉 阅读(2247) | 评论 (0)  编辑

     摘要: XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit。通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能。本文将演示如何在 XCode 4.2 下使用 OCUnit, GHUnit 和 OCMock 进行 iOS 单元测试。  阅读全文
posted @ 2011-12-23 14:12 罗朝辉 阅读(2966) | 评论 (1)  编辑

     摘要: 花了几天时间,在 iPad 上做了一个简陋的 Dicom Viewer,这个查看器没有使用 DCMTK 库(虽然可用,但太庞大,造造轮子亦有乐趣),而是自己移植了一个 Dicom 文件解析器(Thanks to Amarnath S and his great post.)。该Dicom 文件解析器以及开源,源代码在这里 or https://github.com/kesalin/DicomViewer。
先来看看效果图:  阅读全文
posted @ 2011-11-18 06:51 罗朝辉 阅读(9522) | 评论 (0)  编辑

     摘要: DCMTK是德国 Offis 公司开发的实现 DICOM 协议的跨平台开源 C++库,在医学领域里是很有名的,它支持Windows ,Linux,Mac OS,SUN等平台。不过貌似在 iOS 平台上编译 DCMTK 的文档很少很少,折腾了好久终于编译成功了,记录下来。  阅读全文
posted @ 2011-11-10 12:59 罗朝辉 阅读(9150) | 评论 (13)  编辑

     摘要: 前文已经说了如何配置服务器,下面来演示如何创建一个新仓库,然后与 XCode 结合。  阅读全文
posted @ 2011-11-08 17:54 罗朝辉 阅读(8592) | 评论 (0)  编辑

     摘要: XCode 默认支持 Git 作为代码仓库,当我们新建一个仓库的时候,可以勾选创建默认仓库,只不过这个仓库是在本地的。本文介绍如何在 mac 机器上创建 Git 服务器,总体思路是:使用 gitosis 来简化创建过程,在用作服务器的机器上创建一个名为 git 的账户来创建 git 服务器,其他客户端通过 ssh 机制访问 git 服务器。  阅读全文
posted @ 2011-11-07 16:09 罗朝辉 阅读(9740) | 评论 (2)  编辑

     摘要: [译]苹果 Cocoa 编码规范中文版
官方文档:Coding Guidelines for Cocoa
本文档下载:点击这里  阅读全文
posted @ 2011-11-03 16:02 罗朝辉 阅读(5466) | 评论 (1)  编辑

     摘要: Objective C 的类方法(class method),即 static 方法,是用 + 修饰的方法。类方法是属于类对象的,所以无需创建类的实例对象我们就可以直接使用它们。使用形式为:
[ClassName classMethod];
在这里 ClassName 代表的就是一个类对象,而不是作为一种类型。类名只有出现在接收消息的表达式中才代表一个类对象,其他情况下都表示一种类型。  阅读全文
posted @ 2011-11-01 17:14 罗朝辉 阅读(2773) | 评论 (2)  编辑

     摘要: 在前文 深入浅出 Cocoa 之 Framework 中讲解了 Framework,接下来讲解 plugin。如果你对 Framework 还不太熟悉的话,请阅读那篇文中,在本例中使用到了 framework,并在本文中没有详细讲述其创建和使用过程。

为什么要引入插件?
我们知道编译程序时,会连接相关 framework,通常我们所连接的框架是 Foundation 和 Application 框架。当程序启动运行时,每个被连接到的 framework 都会被加载到该程序的 objc 运行时环境中。如果我们想向正在运行的程序加载新的 framework,那该怎么办呢?答案之一就是使用 plugin 机制。cocoa 的 plugin 机制通常由 NSBundle 类来实现,而实现动态加载的功能由函数 objc_addClass 来完成。一般我们无需与 objc_addClass 这个函数打交道,我们使用 NSBundle 来完成绝大部分与 plugin 相关的工作。

plugin 机制能够让我们开发出高度模块化,可定制以及可扩展的应用程序,并  阅读全文
posted @ 2011-10-28 14:44 罗朝辉 阅读(2527) | 评论 (0)  编辑

     摘要: Framework 简介
Mac OS X 扩展了 framework 的功能,让我们能够利用它来共享代码和资源。framework 在概念上有点像 Window 下的库,但是比库更加强大,通过 framework 我们可以共享所有形式的资源,如动态共享库,nib 文件,图像字符资源以及文档等。系统会在需要的时候将 framework 载入内存中,多个应用程序可以同时使用同一个 framework,而内存中的拷贝只有一份。一个 framework 同时也是一个 bundle,我们可以在 finder 里浏览其内容,也可以在代码中通过 NSBundle 访问它。利用 framework 我们可以实现动态或静态库的功能。与动态/静态库相比,framework 有如下优势:  阅读全文
posted @ 2011-10-16 14:10 罗朝辉 阅读(4387) | 评论 (3)  编辑

     摘要: 最近在研究如何在 Mac 上使用 .Net,在这个过程中,找到几个好玩的东西:
第一个是,CSharpPlugin,链接为:http://code.google.com/p/cocoa-sharp-dev/wiki/CSharpPlugin,这个插件很神奇,可以让我们在 XCode 中编写 C#,并在编写的C#中可以调用 Cocoa API,牛吧?可惜的是这个插件很久没有更新了,最后的更新时间为 2007年5月。
第二个是,MonoDevelop,链接为:http://monodevelop.com/,一般我们还需要安装 Moonlight 。我们可以在其中编写具有 Cocoa 界面风格的 C# 程序。这个 IDE 做得非常清爽,并在持续更新中。
第三个是, 使用 Emonic 插件在 Eclipse 上开发,下面将介绍这种方式。  阅读全文
posted @ 2011-10-15 14:21 罗朝辉 阅读(2870) | 评论 (2)  编辑

     摘要: 本文通过使用 Bonjour 在 Mac 上实现了一个简单的服务器/客户端聊天程序,以演示如何使用 Bonjour 进行网络编程,其中使用到 CFSokcet, NSNetService/NSNetServiceBrowser, NSInputStream/NSOutStream 的用法。  阅读全文
posted @ 2011-09-25 15:43 罗朝辉 阅读(2475) | 评论 (0)  编辑

     摘要: 前面讲解了 Core Data 的框架,并完全手动编写代码演示了 Core Data 的运作过程。下面我们来演示如何结合 XCode 强大的可视化编辑以及 Cocoa 键值编码,绑定机制来使用 Core Data。有了上面提到的哪些利器,在这个示例中,我们无需编写 NSManagedObjectModel 代码,也无需编写 NSManagedObjectContext,工程模版在背后为我们做了这些事情。

今天要完成的这个示例,有两个 Entity:StudentEntity 与 ClassEntity,各自有一个名为 name 的Attribute 其中 StudentEntity 通过一个名为 inClass 的 relationship 与 ClassEntity关联,而 ClassEntity 也有一个名为 students 的 relationship 与 Entity:StudentEntity 关联,这是一个一对多的关系。此外 ClassEntity 还有一个名为 monitor 的 relationship 关联到 StudentEntity,代表该班的  阅读全文
posted @ 2011-09-09 14:21 罗朝辉 阅读(3190) | 评论 (0)  编辑

     摘要: NSWorkspace 为应用程序提供如下服务:
1)打开,操作文件/设备,获取文件/设备信息
2)跟踪文件,设备以及数据库的变动
3)设置或获取文件的 Finder 信息
4)启动应用程序。  阅读全文
posted @ 2011-09-05 16:04 罗朝辉 阅读(3123) | 评论 (0)  编辑

     摘要: 前面详细讲解了 Core Data 的框架以及设计的类,下面我们来讲解一个完全手动编写代码使用这些类的示例,这个例子来自苹果官方示例。在这个例子里面,我们打算做这样一件事情:记录程序运行记录(时间与 process id),并保存到xml文件中。我们使用 Core Data 来做这个事情。  阅读全文
posted @ 2011-09-03 23:16 罗朝辉 阅读(3403) | 评论 (0)  编辑

     摘要: Core data 是 Cocoa 中处理数据,绑定数据的关键特性,其重要性不言而喻,但也比较复杂。Core Data 相关的类比较多,初学者往往不太容易弄懂。计划用三个教程来讲解这一部分:
框架详解:讲解 Core data 框架,运作过程,设计的类;
Core data应用程序示例:通过生成一个使用 Core data 的应用程序来讲解如何 在 XCode 4 中使用 Core data。
手动创建Core data示例:不利用框架自动生成代码,完全自己编写所有的 Core data 相关代码的命令行应用程序来深入讲解 Core data的使用。  阅读全文
posted @ 2011-09-01 14:14 罗朝辉 阅读(5803) | 评论 (0)  编辑

     摘要: block 是 Apple 在 GCC 4.2 中扩充的新语法特性,其目的是支持多核并行编程。我们可以将 dispatch_queue 与 block 结合起来使用,方便进行多线程编程。  阅读全文
posted @ 2011-08-26 13:23 罗朝辉 阅读(12278) | 评论 (5)  编辑

     摘要: 本文详细讲述了Object-C 中消息的里里外外,涉及类结构class, SEL, IMP,消息的动态绑定,消息转发等。  阅读全文
posted @ 2011-08-15 20:20 罗朝辉 阅读(7916) | 评论 (1)  编辑

     摘要: Objective C 与 C++ 两者最大的相同便是: 都是从 C 演化而来的面向对象语言, 两者都兼容标准 C 语言; 两者最大的不同便是: Objective C 提供了运行期动态绑定机制, 而 C++ 是编译时静态绑定, 并通过嵌入类(多重继承)和虚函数(虚表)来模拟实现. Objective C 在语言层次上支持动态消息转发, 其函数调用语法为 [object function], 而且C++ 为 object->function(). 两者的语义也有不同, 在 Objective C 里是说发送消息到一个对象上, 至于这个对象能不能处理消息(也就是说实现了这个函数与否)以及是处理还是转发消息都不会 crash, 而在 C++ 里是说对象进行了某个操作,如果对象没有这个操作的话,要么编译会报错(静态绑定),要么程序会 crash 掉的(动态绑定).
  阅读全文
posted @ 2010-12-26 12:30 罗朝辉 阅读(10372) | 评论 (7)  编辑