你是否真的需要iPhone?

This item was filled under [ iPhone学习 ]

from:http://www.kenengba.com/post/765.html

刚才中午有个网友问我,是否会写写关于iPhone的文章,其实iPhone刚上手的时候我就写了一篇,当时发出了很多抱怨。
如今,使用了一段时间,该玩的都玩了, 能折腾的都折腾了,我觉得我可以对iPhone作出比更多的评价了。
如果你打算入手一台iPhone,那这篇文章是为你而写的。如果不是,你也可以了解一下iPhone的一些比较让人感到贴心的地方。

一、从哪里购买iPhone?

目前在中国出售的iPhone全部为水货,有来自美国的,也有来自香港的,还有意大利、澳大利亚等等。
你可以选择在中国购买水货还是让朋友在外国给你捎一台,选择哪种方式就看你的实际情况和你遇到的价格了。
或许你会说,联通不是很有可能在5月引入iPhone吗?到时候买行货不很好么?
如果地球人没有猜测错误,iPhone入华后应该会将wifi阉割掉。如果iPhone是个男人,这好比将他的一个睾丸割掉,你可以想象这是多么大的损失。
你可以在网上找到不少关于iPhone的出售消息,也可以到附近的奸商聚集地购买,iPhone 3G的美版8G价格可能在3500-4300RMB左右。价格能低到多少,就看你和奸商怎样拉锯战了。
二、破解,越狱

和其它一些手机不一样,iPhone购买后一般要做两件事:
1、破解
破解的意思是将iPhone锁定运营商的设定破坏。
破解不是必须的,因为有些iPhone已经是运营商解锁了,这样的iPhone以后即便升级也无需破解,如果你懒得破解,无锁版iPhone是不错的选择,比如港版iPhone就是无锁版的了。但目前市面上最多的美版是必须要破解的,而且每次升级都必须小心!
2、越狱
越狱的意思是将iPhone锁定只能安装Apple App Store的限制破除。

如果你的iPhone不越狱,你就不能安装很多第三方的软件,这是一种带有罪恶的浪费。举2个实际的例子,你无法让iPhone用上复制粘贴功能,不能删除单条短信。
虽然越狱不是必须的,但如果你不把iPhone越狱,这几乎可以说你浪费了iPhone,你买iPhone可能只是为了炫耀。
那么,如何越狱?这不是本文要讨论的范围。
三、iPhone可以做什么

它可以:
1、打电话
2、发短信
3、上网:EDGE或WIFI
4、拍照
5、看视频,听音乐
6、管理日程、收发邮件
7、安装软件
这不是跟其它手机一样吗?说了一大堆废话!
这只是表面的,为什么?用什么理由说服自己购买一台iPhone呢?请继续看下去。
四、iPhone不可以做什么

如果你不越狱,你的iPhone不可以做:
1、删除单条短信
2、复制粘贴
3、多任务运行
4、节省EDGE上网流量
5、在号码前加12593等再拨号
6、转发短信
7、用蓝牙传输文件
8、发彩信
9、录像
10、让程序不那么容易崩溃
11、关机闹钟
12、电话录音
13、VoIP通话
看起来很糟糕吧?那越狱之后呢?
越狱之后,你还是不可以做的是:
1、用蓝牙传输文件 (蓝牙已被破解)
2、让程序不那么容易崩溃
3、关机闹钟
4、电话录音
看起来,越狱后很多糟糕的事情被解决掉了,为什么?
请回头看前面说越狱带来的好处。
五、一些比较人性化的地方

苹果的产品一向给人一种豪华、用户体验良好的感觉,iPhone上也是如此么?我认为是,很多细节的地方都能找到iPhone和其它手机不一样的特点。
1、多点电感触屏
这或许不需多说,这是iPhone的卖点之一。苹果是第一个将多点触屏技术如此完美地应用到手机的厂商,利用多点触屏,你能提高不少效率。
比如你可以用两只手指伸张来放大图片,反之让其缩小。

另一点是iPhone的触屏是电感的,并非压感或热感。这意味着,你只许轻轻触摸屏幕就能让iPhone做出反应,无需使劲敲打。这不但有效地保护了屏幕,也避免了其它绝缘体无意触屏后发生你不想看到的后果。
2、重力感应旋转屏幕
很少手机有重力感应。顾名思义,这个装置会跟着地心指向的改变作出反应。
比如,当你将iPhone竖放,接着旋转90°后,程序界面可能也会跟着变成横屏,很抽象?看图:

3、打电话时自动关闭屏幕
当你将iPhone贴着脸部打电话时,iPhone会自动关闭屏幕省电。因为iPhone有红外感应功能。
当你将iPhone拿离脸部,屏幕会自动亮起,因为这时你可以需要进行其它操作,或“中文请按1,for english press 2”.
4、插耳机自动打开iPod
在大多数情况下,如果iPhone处于闲置状态,插入耳机都是因为我们想听歌或看视频。苹果想到了这点,当你在iPhone没有打开窗口的情况下,插入耳机,iPod会自动打开并开始播放音乐。
我个人是非常喜欢这一设计的。
5、开机密码输入
以前用Nokia的时候,开机输入密码后需要按【确认】,但实际上我们需要多做这一步骤么?
不需要!在iPhone开机时输入密码是无需按确认按键的。

6、隐藏隐私视频
在同步视频前,你可以设置视频为“EXPLICIT”,通常这可能是一些隐私或黄色的视频。
接着,你设置了不允许“EXPLICIT”内容,这些视频就会被隐藏起来,除非你输入密码打开。即便遇到警察,也不怕被罚1900元。

7、变速滚动
我想不到更容易让人理解的小标题。
iPhone翻屏和滚动都需要你用手来“上下左右”推拉,你手指移动的速度越快,它滚动的速度就越快。
8、震动/铃声快速切换
iPhone的左侧上部有个按钮,使用物理拨动的方式来切换震动和铃声,我很喜欢这个设计。
因为对于我来说,经常需要在这2个模式之间切换,如果使用软件方式切换,那将大大增加操作成本:
打开屏幕-输入密码-设置-情景模式-震动/铃声-退出-关闭屏幕
而这个按钮却是一步到位的。
9、容易上手
这只是我片面之词,当你真正使用了,你会发现你根本无需学习太多新的东西就能很好地使用iPhone了。
六、iPhone适合的对象

1、你是疯狂的水果贩
2、iPhone的软件相当多,几乎可以满足你所有的需求,如果你想省钱,破解的也有很多。
3、你喜欢大屏幕触屏手机
4、你想要更人性化的手机
5、你不想又带手机又带MP4
6、你十分喜欢用手机上网
7、喜欢新事物,喜欢折腾的人
七、iPhone不适合的对象

1、经常要非徒手工作的人
带着手套,或手上有涂料或绝缘材料,iPhone将不会听你使唤。
2、手一直都很凉的人
虽然iPhone的电感的,但当手的温度过低时,触屏会变得不灵。
3、手机只用来打电话和发短信的人
除非你买iPhone是用来炫耀的,不然你还是买个黑白的吧。
4、喜欢手机可以运行多任务的人
即便有Backgrounder可以实现多任务运行,但由于系统剩余给程序的内存实在太少了,多任务往往会导致崩溃。
5、只用非windows和非Mac,且不用虚拟机的人
没有iTunes,你怎么刷机?怎么传输音乐视频?
6、希望关机使用闹钟的人
又想省电,又想用iPhone闹钟?对不起,你找乔布斯去吧。
7、短信狂人
触屏打字是比较辛苦的,短信狂人们最好慎重考虑,尤其是希望可以盲打的人。

Bookmark and Share

10个优秀的免费iPhone软件推荐

This item was filled under [ iPhone学习 ]

from:http://www.kenengba.com/post/769.html

继续iPhone的话题,如果你看了“你是否真的需要iPhone?”后决定入手一台,那恭喜你,你还有很多事要做,否则你还是买台不能扩展的手机吧。
这篇文章介绍10个非常好用的iPhone软件,全部都是免费的。大多数都是需要越狱才能安装的。

如果你已经在使用iPhone了,但没有越狱,这篇文章可能会激起你越狱的欲望。越狱和翻墙一样,是十分让人兴奋的。
一、越狱并配置Cydia

虽然胡总说不折腾,但甘于现状不是一个好的追求,如果你的iPhone/iPod没有越狱,强烈推荐你马上进行越狱。
你可以随意搜索到越狱教程,也可以先参考一下何必呢之前写的iPhone超级指南系列。
现在,假设你已经越狱了,并安装了Cydia,在进行下面的步骤前,请确保你的Cydia里有以下这些软件源:
1、apt.bigboss.us.com/repofiles/cydia
2、iphone.freecoder.org/apt
3、www.ispaziorepo.com/cydia/apt
没有请添加之。
二、10个优秀的iPhone软件/应用

1、保护Home键:iHome
默认情况下,退出iPhone程序只能按Home键,如果不加节制,Home键很快就会失灵,到时候你就后悔了。
国人马骏开发了iHome小程序,只需在屏幕底部从右向左划一下就能退出程序,很大程度上保护了Home键,强烈推荐安装。
另外,iHome还有一个副功能,从左向右划短线,就会出现“重启、关机”等选项,同样保护了开机按键。

更多的操作技巧请参考马骏的文章。
2、拨号辅助:jPhone
在默认的情况下,iPhone的通信记录是不区分拨入拨出的,拨号之前也不提供编辑号码的功能。
jPhone为解决这2个问题应运而生,除了可以将来电去电区分外,还可以在拨号之前编辑号码,比如添加12593,010等等。

3、快速短信:iRealQuickSMS
正在浏览网页,突然来了个短信,要回复的话就必须退出浏览,很不爽吧?
iRealQuickSMS是从收费软件iRealSMS分拆出来的小程序,安装后你可以在不退出任何程序的情况下回复或发送短信,强烈推荐安装。

4、复制粘贴:Clippy
不知道后天公布的iPhone 3.0会不会有复制粘贴功能,不然我真的想砍乔布斯。
iPhone的复制粘贴软件有2个,我认为Clippy更好用一些,操作起来相对更方便。

Clippy提供多重粘贴板的功能,能记录多次的复制内容,就像在“提高windows效率的8个软件”里介绍的ClipX一样。
5、优秀输入法:iCosta
iPhone默认的中文输入法选字区域会跟着光标移动,这样手的移动成本就大大增加。另外,默认的输入法提供的选字实在太少了,连“十大新词”里的“囧”字都没有。
iCosta提供了几种输入法,包括拼音、五笔。但不能同时安装,只能选安装一个。

6、服务开关:Bossprefs
关闭掉iPhone里的莫须有的服务吧!本来内存就被系统占了一大部分,还要开那么多无用的服务是很浪费的。
你可以在安装Bossprefs后下载这个文件,解压放在下面的目录:
/Applications/BossPrefs.app/
文件权限755
这时,你就能在Bossprefs里看到服务开关,尽情关掉不需要的吧。

7、快捷操作:SBsettings
SBsettings提供了快捷操作的解决方案。
比如有时我们在运行某个程序,但突然想调节屏幕亮度,默认情况下我们必须退出程序,然后进入到设置里调整。
而安装SBsettings和亮度调节按钮后,你可以在屏幕上方轻轻一划,在出现的SBsettings窗口里调整亮度。

一些常用的按钮你都可以在Cydia里搜索到,这里推荐一些:
AutoCorrect (自动更正)
Bluetooth
Brightness
Close App (有时你可以用iHome,也可以用这个按钮来关闭程序)
Location (GPS定位)
Phone (飞行模式切换)
Processes (进程管理)
8、图标分类:Categories
我已经安装了8页的程序,不像S60,iPhone的程序图标不能放到文件夹里面。
但Categories提供解决方案,你可以建立文件夹,使用不同的图标,将程序放置到指定的文件夹里面,这时,你的桌面就显得干净多了。

9、RSS阅读器:GRiS
昨天我试用了5款RSS阅读器,最终选择了开源的GRiS。
它能与Google Reader双向同步,获取GR里的RSS更新,阅读后再同步,GR里也会将这些项目标记为已读。

它相对其它RSS阅读器的好处是可以选择同步GR的某些tags,而不是全部,我看中的就是它这个功能。
10、联系人、日程同步:Google Sync
昨天某网友告诉我他换了手机号码,我毫不犹豫地打开了Gmail,进入通信录修改他的电话。
如果以前,我会打开手机,然后修改号码。

这个改变是因为我用了Google Sync,它能实时地双向推送日程表和联系人的更新,详细请参看”Google Sync试用感受”。

Bookmark and Share

iPhone手机开发平台入门介绍和教程

This item was filled under [ iPhone学习 ]

欢迎转载,作者:手机即信息 博客:http://canco.javaeye.com

1. iPhone手机介绍
首先需要了解和破解iPhone手机,下面一个帖子介绍很详细:
iPhone最权威 [入门] [破解] [扫盲] [资源] [修砖] 总汇帖
http://www.weiphone.com/thread-41690-1-1.html

iPhone手机手册的中文翻译
http://down.tgbus.com/soft/16820.shtml

2. Unix常见命令
iPhone手机的操作系统是Mac OS X,内核是unix,所以可以iPhone手机上运行unix命令。
http://www.weiphone.com/thread-15894-1-1.html

3. Windows平台上iPhone开发环境搭建
见笔者的文章《Windows平台上iPhone基于cygwin开发环境的搭建方法》,文件链接:
http://canco.javaeye.com/admin/blogs/199106

4. Toolchain和iPhone SDK
Toolchain与官方iPhone SDK的比较请见文章:
《比较官方iPhone SDK和开源工具链》,文章链接:http://www.cocoachina.com/index.php/archives/cocoachina_149.html
iPhone SDK介绍和分析
见西西河的AllenKids先生的2篇文章:
iPhoneSDK观察 – 舞姿飘忽,苹果的探戈
http://www.20ju.com/content/V19377.htm
iPhone SDK 观察二:舞台宽广,才能跳得欢畅
http://www.cnbeta.com/articles/55055.htm

iPhone SDK, Toolchain, Windows Mobile, SymbianOS S60的比较
http://www.rsslite.com/post/1889.html

iPhone用户界面指导原则
http://www.20ju.com/content/V22381.htm

5. iPhone开发语言:Objective-C
iPhone原生程序开发语言主要是用Objective-C语言,如果你熟悉C/C++语言,则能很快掌握Objective-C。Objective-C语言主要要理解可变参数,Categories, Posing, Protocols等特性。
Objective-C初學者指南(繁体)
http://www.otierney.net/objective-c.html.zh-tw.big5Objective-C语法快速参考
http://www.cocoachina.com/index.php/archives/cocoachina_122.html
Learn Objective-C
http://cocoadevcentral.com/d/learn_objectivec/

The Objective-C 2.0 Programming Language
http://developer.apple.com/iphone/(注:需要注册为apple会员才可以下载)

6. iPhone开发书籍、文章和源代码
由iPhone开发和破解领路人Jonathan Zdziarski著作,最最重要、最值得推荐和唯一的开发书籍《iPhone Open Application Development》,可通过google下载电子版。

Creating an iPhone Application
iPhone OS Overview
iPhone OS Programming Guide
iPhone Human Interface Guidelines
Cocoa Fundamentals Guide
http://developer.apple.com/iphone/(注:需要注册为apple会员才可以下载)

Lucas Newman 的18页iPhone开发PDF教学
http://lucasnewman.com/phonedev.pdf

學習怎樣在 iPhone/iPod Touch 上開發自制遊戲全記錄
http://www.weiphone.com/thread-81192-1-2.html

CocoaChina整理的开源iPhone程序不完全列表
http://www.cocoachina.com/index.php/archives/cocoachina_143.html

几个源码例子
http://lucasnewman.com/phonedemos.zip

7. iPhone论坛和网站
平果开发中文站-最好的中文iPhone开发网站!
http://www.cocoachina.com/

苹果官方的开发网站:
http://developer.apple.com/iphone/

Weiphone
http://www.weiphone.com/index.php

苹果fans成立的网站:
http://apple4.us/

Bookmark and Share

Leopard轻松编程:帮你节省代码

This item was filled under [ iPhone学习 ]

注:

这 是一篇我很早就想翻译的文章。作者集中介绍了很多Leopard中增加的新内容,对于开发者而言,很多在从前10.4上需要花很大精力,很大代码量但是很 有用的东西,在新的Leopard中,可以很轻松地实现。我在这里翻译过来放到Cocoachina,展示给大家,希望能够给大家带来帮助。由于水平有 限,如果文章内容有错误的地方,还请指正。

 

目录:

 

- Core Animation 核心动画

- 视图描绘

- 和快速查看协同工作

- 管理多视图(针对自定义的分页控件等)

- 图片或者视图以iPhoto形式的动画表格进行呈现

- 设置你自己的智能组、播放列表、目录

- 在菜单里加入自定义视图

- 菜单增强

- 打印界面

- 全局类型标志

- 像邮件程序一样使用分栏视图

- 将文档图标显示在标题条内

- 类似iPhoto工具条形式的HUD窗口

- 控制窗口的材质、金属形式,并可以控制绘画位置

- Spaces集成

- “不要再提示我”

- 针对不同窗口和程序的Dock图标,包括徽章和数字

- 准确追踪鼠标

- 更多文本格式

- 布局管理器增强

- Safari 3风格的搜索结果

- 自动链接、引用和内建的图片编辑

- 拼写检查

- 去掉按钮中不需要的图片

- 免费图片和图标

- 通过平铺小图片画复杂图形

- 凹进形式的方框

- 内建提供的色彩渐变支持

- 增强的TableViews 和 OutlineViews

- 源头列表

- iTunes 歌曲商店形式的路径显示

- 内建的图片编辑

- 内建的PDF查看和浏览

- 卸载程序包

- 获取内存和处理器信息

- 更简单的优先级序列

- 显示日期

- 字符串编码

- Core Data更有效的表达式

- 脚本支持

- 和iCal以及其他数据协同工作

- RSS 支持

- Interface Builder

 

 

 

作者:Matt Gemmell

 

正文:

 

做 为Cocoa的开发者,每一个新版本的Mac OSX的发布,都需要我们花费时间熟悉它们所提供的新的API和机制。在这个熟悉过程中,一个主要的目标是了解操作系统提供的新的控件和功能。这些功能我 们在之前的版本中只能自己用代码去实现,而现在系统自身就提供了相应的调用接口。

 

 

在 过去的几个月里,我一直在使用Leopard。我认为我应该列举出一些新的API,Cocoa应用程序开发人员们会对它们感兴趣。我会分门别类地介绍它 们,并会附带一些截图。您可以在留言中加入您所发现的新功能。我会按照AppKit和Fundation发布说明中的顺序去介绍他们,而如果您真的期望关 注Leopard的新功能,建议您也去查看这些这些发布说明。

 

自然,这些新的API对于之前版本的支持方面的确有些问题,但是这并不会影响这些新的功能的实用价值。

 

Core Animation 核心动画

 

这 是需要介绍下的东西。如果你花一些时间阅读文档,特别注意一下“带层的视图”和“动画代理”这些概念,你可以仅仅通过在Interface Builder中进行一些简单的设置,就做出一些意想不到的事情。另外,你在写代码的过程中,将从前发送消息到yourView(可以是任意view)改 成发送消息到[yourView animator],就可以直接做出一些动画特效来。

 

看一下 NSAnimatablePropertyContainer,你也可以在view中添加自己的动画属性。

 

 

 

视图描绘

 

当一个视图被隐藏、显示和即将进行描绘的时候,会自动通知你。这些通知你都可以通过创建子类的方式,建立接收方法。这会帮助你在描绘视图的时候做更有效的预先计算和缓存。而且你可以同时直接操作一个视图的所有子视图。

 

和快速查看协同工作

 

你可以自己编写快速查看功能的插件,这样快速查看可以直接预览你创建的自定义文档的内容。这和10.4版中允许你创建Spotlight插件进行索引文档一样。

 

你还可以直接通过调用在QuickLook框架中提供的 QLThumbnailImageCreate()函数,请求快速查看生成的文档预览内容。你可以指定预览数据的大小、类型,甚至可以直接画成一个图标(可以增加阴影、文档翻页等效果)。

 

管理多视图(针对自定义的分页控件等)

 

现在有一个新的 NSViewController类,使用这个类你可以管理多个视图并支持视图绑定。这个类可以帮你省去一大堆在用户请求时切换视图的代码。

 

图片或者视图以iPhoto形式的动画表格进行呈现

 

用 IKImageBrowserView直接进行调用。在Interface Builder中设置一个,直接开始模拟,你就能看到效果。下面的例子没有使用一行代码(而且是控件默认的属性设置),仅仅是一个nib文件。这个例子可 以显示出你桌面的图片,支持多重选择,自动排列,动画效果的拖拽重新排列。

注 意, IKImageBrowserView是一个制作好了的控件,使用了新的 NSCollectionView类。之前这个类被称作 NSGridView,现在叫做 NSCollectionView。同时,有一个叫做 PubSub的例子使用了IKImageBrowserView,你可以在 /Developer/Examples/PubSub/NewMusic/ 这个目录里找到这个例子。

 

 

设置你自己的智能组、播放列表、目录

 

你可以使用NSRuleEditor 和 NSPredicateEditor 这两个类,开发我们所熟知的规则编辑界面。

 

 

在菜单里加入自定义视图

 

NSMenuItem现在提供了一个-setView (和-view) 方法供调用。无需使用Carbon直接可以在菜单里增加自定义控件。通过定时器产生的动画效果也可以工作,但是需要注意你使用的循环。(必须是事件跟踪循环模式,因为是在菜单内)

 

 

菜单增强

 

当一个菜单项被打开、关闭、选中以及取消选中时,你将会以通过托管的方式得到通知。

 

你可以在不同的菜单上设置不同的快捷键,只要他们执行的动作一样。如果快捷键应当触发一个被禁用了的选项,你的应用程序也可以对其进行响应。这项改进可能会帮你省掉一些定制的代码。

 

打印界面

 

打印界面有了很大的增强,尤其是对于附属视图的支持上,你的程序现在可以真正地定制需要打印的部分。如果打印支持是你程序里很重要的一部分,那么你需要重新好好看一下NSPrintPanel和NSPageLayout,这两个类增加了非常多的新资料和新的功能。

 

全局类型标志Uniform Type Identifiers

 

Leopard 现在大大地通过文档结构支持了UTI,包括NSDocument,打开、保存工具窗口、程序信息、NSWorkspace等等。同样支持了拖拽类型、剪贴 板数据、服务定制、图片类型和其他类型的支持。如果你准备简化并全局化程序的数据类型,而不想使用很多重复的常量定义,你应该看看这部分说明。

 

像邮件程序一样使用分栏视图

 

NSSplitView现在被明显地增强了。仔细阅读API文档,你会发现程序化地折叠、修改分栏厚度和激活区域,甚至指定一个用于拖拽的区域都变得非常简单。而且还修改了一些错误。

 

将文档图标显示在标题条内

 

要实现这个功能,你无需通过使用NSDocument体系,现在系统提供了一个新的方法去控制图标显示的形式、是否需要弹出菜单等功能。

 

类似iPhoto工具条形式的HUD窗口

 

现在系统支持一种HUD窗口形式,包含在NSPanel当中。这种窗口可以设置为无边框形式,同时显示为半透明黑色背景。直接使用这种窗口,你可以节省很多定制这种类型窗口的代码。

 

 

控制窗口的材质、金属形式,并可以控制绘画位置

 

现在系统提供了检测窗口材质边框厚度的方法。比如,你可以定义窗口最底部的100点应当有材质。这些方法可以帮你简化自定窗口的子类,或者仅仅为了画一个特定背景的窗口而写的额外的视图。

 

Spaces集成

 

当 你的窗口显示在特定Space虚拟桌面中,或者用户切换了Space时,你可以选择不同的显示方式。基本来说,你可以指定自己的窗口是否需要使用默认的行 为(显示在一个虚拟桌面中,保持在这个桌面直到指定其移动),或者一直显示在当前屏幕上,或者在所有的桌面中都一直显示。请参阅 NSWindowCollectionBehaviour以了解更多信息。

 

“不要再提示我”

 

在 过去,如果你需要将对话框显示成这种样子(通常在对话框底部显示一个单选框,选中后这个提示就不再出现),你需要写不少代码去实现。在Leopard 中,NSAlert直接支持这种形式的对话框了。你可以节省很多代码以及制作这类窗口所花费的精力。请参阅 NSAlert中 setShowsSuppressionButton: 和 -setAccessoryView: 方法。

 

针对不同窗口和程序的Dock图标,包括徽章和数字

 

系 统提供了一个叫做NSDockTile的新类,允许你控制dock上最小化了的窗口和你自己的程序图标。这个类支持添加、取消图标印章,同时可以定制印章 上的文字。比如你想在图标中显示进度条或者其他状态,都可以通过这个类进行操作。这样你就节省了大量定制代码,也无需自己在图标上画了。

 

准确追踪鼠标

 

和从前提到过的一样,Leopard现在有了一个更好的跟踪鼠标位置的选择:NSTrackingArea 。你可以用它来获得精确的鼠标位置(鼠标进入、退出或者移动),甚至你的程序不在激活状态也可以追踪。

 

更多文本格式

 

现在文字系统支持OASIS开放文档格式和ECMA Office开放XML格式,同时支持新版word格式,这样你可以直接在程序中添加导入导出选项,无需撰写其他代码。

 

布局管理器增强

 

如果你一直用NSLayoutManager对布局进行管理,你应该了解,现在它支持非连续布局。如果你想花点时间学学如何实现的话,它对你的程序有了很大的性能改善。还包括了一些改善,诸如获取特定字体的基础偏移位置以及显示不可见项目。

 

Safari 3风格的搜索结果

 

Safari 3 提供了一个很漂亮的搜索结果视觉效果,在正文中将搜索结果高亮显示为小黄色方框。你也可以提供这种风格的支持,在 NSTextView 中使用 showFindIndicatorForRange:方法,就可以直接拿来用了。拿这个好功能做点好事,可别做坏事:)

 

自动链接、引用和内建的图片编辑

 

NSTextView 现在支持这几个功能,还包括链接的鼠标提示。你甚至可以通过检查 NSAttributedString,去获取它是否在指定位置发现一个URL。又帮你省掉很多定制代码。

 

拼写检查

 

你也许注意到了Cocoa文字系统中提供的新的语法检查器(绿色下划虚线),你可以直接调用他们。

 

去掉按钮中不需要的图片

 

如 果你的程序里有自定义的按钮,你大概为这些按钮的不同状态画了很多图片,普通状态、按下状态等等,你还得写很多代码把这些图片捏在一起。Leopard可 以帮你省下这些图片,通过 NSImage的 -isTemplate和 NSCell的 -backgroundStyle。请参阅文档,不过基本上:

 

你可以指定一个图片,告诉Cocoa,这是一个“遮罩”,Cocoa就会帮你将它在不同情况下高亮(有点类似iCal中左下方那些按钮的状态)

你可以告诉NSCell如何显示文本,显示在什么背景:暗色、亮色、凸出的还是凹进的。你可以只画一个图片就能实现Safari里添加书签那种按钮的效果(高亮、非高亮、雕刻、凸出)

 

这个功能可以明显减少你的程序尺寸和内存占用,还能减少美工预算。请参阅文档,另外注意NSStatusItem也支持这种功能。

 

免费图片和图标

 

长 久以来我们一直在盗用苹果的图标,现在你可以随便用了。NSImage中的-imageNamed:方法里提供了大量的新标准图片供你使用,这些图片包括 Safari书签图标、所有的箭头、齿轮图标、电脑图标、蓝牙和Bonjour Logo、用户图标、信息图标还有很多很多。你程序的尺寸和图标设计预算可以大幅减少了。(别担心,NSButtonCell支持 imageScaling参数,这样这些图标可以随意缩放)

 

 

如果你想看看这些图标,在Interface Builder中拽进一个NSImageView,用下拉框查看这些图标,都在里面。

 

通过平铺小图片画复杂图形

 

Leopard现在提供了两个函数,分别叫做NSDrawThreePartImage() 和 NSDrawNinePartImage()。这两个函数可以让你使用小图片填充进大的图形。这些函数都是分辨率无关的,可以帮你省下二十行以上的自定代码。

 

凹进形式的方框

 

NSBox现在支持自定义背景和边框颜色,你还可以自己选择边框宽度和圆角。你又可以扔掉一个自定义的子类控件了。

 

内建提供的色彩渐变支持

 

Cocoa开发中所有人都在使用 CTGradient,它很棒。Leopard中,苹果终于提供了NSGradient类。仔细看看这个类提供的方法,可以很好地帮你制作色彩渐变的用户界面。

 

增强的TableViews 和 OutlineViews

 

我 一直自己建立NSTableView的子类,这样可以让我编辑表格中的内容(比如复选框等),编辑的同时不会选择整行。Leopard提供了这个支持,可 以让你选择是否要追踪一个表格的编辑状态。现在系统提供了继承的方法,让我们支持选择控件内容,并且支持拖拽、关联菜单和直接编辑。

 

如果你需要iTunes或者Finder侧栏效果,你也可以做出来了。现在系统提供了定宽表格列,你可以直接实现这个效果。

 

源头列表

 

我们讨论这个问题好几年了,Leopard终于可以让你在 NSTableView 和 NSOutlineView 中制作高亮效果。不用写定制代码,就可以作出i什么什么的软件效果了。

 

iTunes 歌曲商店形式的路径显示

 

新提供的NSPathControl (和其中的Cell 与 ComponentCell或者类似的东西)让你可以显示为这种形式,就像iTunes歌曲商店的那种路径。可以显示为弹出菜单,或者类似路径条的样子。你可以在Interface Builder中做做看。

 

内建的图片编辑

 

IKImageView (Interface Builder直接提供) 提供给你图片视图,并且自动支持图片编辑功能、预览的切割、选择、移动、脚注和其他功能,完全不用自己编写代码。现在你在处理图片的时候,没理由不提供一个简单的图片编辑功能了。

 

 

内建的PDF查看和浏览

 

PDFView 提供给你PDF文件预览形式的浏览、选择、缩放等支持。新增加的 PDFThumbnailView甚至可以让你列出PDF中的页码。无需编写代码,内建支持。

 

卸载程序包

 

NSBundle现在支持卸载,你可以节省下一些内存。

 

获取内存和处理器信息

 

NSProcessInfo现在可以通过调用-physicalMemory 告诉你内存容量,无需使用Carbon,你还可以使用-processorCount获取CPU数目,用-activeProcessorCount获取激活的CPU数目。

 

更简单的优先级序列

 

看一下 NSOperation 和 NSOperationQueue,这是系统提供的比较简单的多线程支持,应该比你自己写的好。

 

显示日期

 

NSDateFormatter 支持更多日期形式。 NSCalendar可以帮你计算时间差,以类似“几周之前”、“几个月前”这种形式显示。

 

字符串编码

 

NSString支持了更多的编码,你可以看看Leopard是否帮你节省了自己做编码的时间。

 

Core Data更有效的表达式

 

NSExpression现在支持子查询、聚集查询、联合查询、交叉查询和减量查询。你可以节省下不少内存和代码,无需自己编写程序实现了。如果你想写出更快、可定制性更强而且更少代码的程序,那你一定要看看文档里关于Core Data中SQL存储的部分。

 

脚本支持

 

Leopard中提供了太多增强的脚本处理功能,无法一一列举。如果你要在程序中使用脚本支持,请阅读Fundation发布说明(从头读到尾)。你可以少写很多代码,而且程序运行更稳定,错误更少。

 

和iCal以及其他数据协同工作

 

日历存储框架允许你存取、编辑、更新iCal数据,这些数据包括诸如日历、任务、时间等,而且很容易使用。同时支持对这些数据的过滤和搜索。

 

RSS 支持

 

如果你希望处理简单地处理RSS,看一下PubSub框架。这个例子是系统本身提供的。

 

Interface Builder

 

看 看Interface Builder中提供的很多新对象吧,你会发现很多有趣的东西。包括了自动化相关视图、AppleScript编辑器、可视化创建工具条、视频截取和很多 Quartz Composer相关的东西。系统甚至提供了支持捆绑兼容的 NSDictionaryController,让你编辑 NSTableView中 NSDictionary的内容。

 

系统还提供了API,你可以自己编写IB对象或者工具条,如果你希望为其他开发者做些事情,你可以看一下这部分。你还可以通过编写这些让自己的开发变得更简单。

 

 

结语

 

现在到了该拿这些东西做点事情的时候了,我想你会希望自己试试看的。花点时间看看Xcode和Interface Builder,这些最新提供的东西会帮助你未来的开发节省很多时间。

 

原文地址:http://mattgemmell.com/2007/10/28/get-rid-of-your-code-with-leopard

Bookmark and Share

教程:如何制作AppleHelp帮助并嵌入到程序中

This item was filled under [ iPhone学习 ]

大部分应用程序都包括在线帮助文档。如果您也希望在自己的软件中包括帮助文档,您也许需要阅读这篇文章。本文简单地介绍了如何最简单地嵌入AppleHelp的方法。有了本文介绍的基础,您就可以开始制作自己软件的AppleHelp帮助了。

 

 苹果帮助文档本身由一些html文件组成。以下是简单地创建帮助的方法:

1 English.lproj (或者其他语言)中创建一个目录,比如 “AppName Help”
2 建立一个index.html文件,加入如下内容
 
<head>
 <meta http-equiv=“content-type” content=“text/html;charset=iso-8859-1″>
 <title>AppName Help</title>
 <meta name=“AppleTitle” content=“AppName Help”>
 <meta name=“AppleIcon” content=“AppName%20Help/images/icon-name.png”>
 <meta name=“AppleFont” content=“Lucida Grande,Helvetica,Arial”>
 <meta name=“AppleSearchResultsFont” content=“Lucida Grande,Geneva,Arial”>
 <meta name=“robots” content=“noindex”>
</head>
 
在后面加入帮助内容
 
3 AppName Help这个目录拽进XCode里,注意不要选中复制到当前项目,然后选择建立目录参考。这样Xcode就会保留这个目录。
4 Info.plist中增加如下项目:
<key>CFBundleHelpBookFolder</key>
<string>AppName Help</string>
<key>CFBundleHelpBookName</key>
<string>AppName Help</string>
5 编译运行
Bookmark and Share

歪批:XCode之外的选择?苹果非主流开发平台概览

This item was filled under [ iPhone学习 ]

从火星来的地球人都知道,苹果提供了一个非常漂亮的免费开发平台XCode,目前 最新版本是3.1 beta,里面甚至包含了iPhone的SDK。它支持Objective-C、Objective-C 2.0、C++、Java、Ruby、Python……很多很多语言。

当然,它的界面需要熟悉,如果你要了解Cocoa框架,那么需要看大量英文文档;你需要了解MVC架构,这些同样要花去你不少时间;而且你还要习惯 Obj-C有点”怪怪“的语法。如果你上大学英文课的时候经常逃课去泡了网吧或是妹妹,你可能会更难受些—-因为像样一点的中文苹果开发资料网站几乎没 有,可能还是有的,就是你现在正在看的这个CocoaChina……也许你只能借助残存在记忆中的那么点英文知识去搜索google了。

不过当然有一点好处,有了Cocoa,你可以扔掉Codewarrior,也不需要使用Carbon去写大量代码实现简单的功能了。再提一句,XCode的自动代码提示让人非常难受。

我们这里不谈和微软的东西比较优劣,我们是苹果的粉丝,死忠。虽然从内心里我不想却不得不承认最新的Visual Studio本身(不是Windows)要比XCode人性化那么一点点,好吧,要人性化很多。

一切还是习惯,习惯就好。人很难摆脱旧的思维和旧的习惯,当你摆脱了旧的习惯,好比—-你习惯了微软的.net,现在需要转到Cocoa上来,也许 你会有些抗拒:就是我们上面提到的那些东西;当然可能有更大的诱惑:你爱苹果,你想在苹果上写程序,你想发财,好吧不是发财,是你想做出一番事业……哦对 了,还有iPhone也是你最爱的新鲜水果。

那你可能也曾经想过,除了XCode之外,我是否还有其他的选择?别的语言?比如我深爱的VB for MAC?更好用一点的IDE?这虽然不是你可以真正放弃XCode的理由,不过值得我们发掘发掘。

 

 

RealBASIC

这家德国公司历史深远,这颗软件意义重大。1998年,第一个版本发布,从此,就像石头扔进了马桶,一波激起千层浪,波澜壮阔,龙腾虎跃,一波未平一波又起……至今过了十个年头,RealBASIC依然阴风阵阵,巍然不倒。靠得是什么?靠得就是它的大无畏的国际主义精神。

那什么是国际主义精神呢?因为它不光支持Mac,不光支持Windows,也不光支持Linux—它全支持!所以叫跨平台的国际主义精神。试想,你 写出一套程序,按一个钮,一下子生成了三个二进制代码,拷贝到相应操作系统就能跑起来,你什么感觉?趾高气昂啊!不麻烦不累,写一套程序仨平台跑,那叫一 个舒坦。

这款开发平台软件最猛的其实还不是它的跨平台功能,最猛的是他的名字,因为他是BASIC。为啥这个最猛?因为我们从小学的就是BASIC呗。从小 妈妈就教导我们,学好BASIC,走遍天下都不怕,学好BASIC,老师高兴同学夸……因为它好学,因为它易懂,因为它最傻瓜化。当年啤酒盖子就是靠 BASIC发的家,所以严谨的德国人秉承了这一传统,做了个更真的BASIC,取名真·BASIC无双!

如果你对VB熟悉,那么你会在这套开发软件上隐隐约约发现大量VB的影子,为什么不叫它Visual Basic for MAC呢?界面很好懂,拽个按钮,拽个文字框。做什么Hello World,我们能做十个HHHeeelllooo WWWooorrrlllddd……

用RB编写简单的程序,你会发现一如VB般简单,生成的苹果二进制代码,界面都是源生mac的样子,速度也蛮快。还有一个很棒的地方,它支持自己的组件,而且有很多人在写RB的组件,拿来就可以用。

用RB编写复杂点的程序,你同样会发现一如VB般思绪如乱麻般难缕,列表中的一百个方法可以让你找得头昏眼花,嵌入的一百个图片让你想用棒子砸死老 板卖掉涨价肉换块大硬盘。调用的一百个carbon声明让你从近视镜换成老花镜,而最最让你恼羞成怒的是老板说你要写跨平台的软件,你还要同样定义一百个 win32的api……你蹲在厕所里边大边想,那linux咋办捏?

Future BASIC

在未来,我们还有一个BASIC……这个叫Future BASIC的东西可以看看。这东西不跨平台,有几个亮点。我看过没玩过,有些地方不太敢乱说。

一个亮点是,你不用花五百美刀去获取一个苹果下的BASIC解决方案,对于预算不多而且惯用免费和OOXX软件的你,无疑要舒服的多。还一个亮点是通吃,从System 7到Leopard,从intel mac到68k,是苹果的机器就能跑。

还有个蛮有意思的东西,它提供了一个FB to C的程序,也就是说你写出了Future Basic的代码,拿这个程序一转换,biu~变成c代码编译了。

那到底啥是Future Basic?开发者说得清楚,开发工具无非就是两块,一块是编辑器,给你拿去写代码;再一块是编译器,编译成机器能执行的二进制程序。就跟揉面一样,弄点面粉弄点水,揉一揉就成面团了。

Objective-Basic

再来个Basic,也是苹果平台的。号称是能够使用所有Cocoa库,面向对象的Basic。而所有这些有一个前提,你得熟悉Cocoa。

说白了Objective-Basic就是一个转换器,把你写的半Objective-C,半BASIC的代码,转换成真·Objective- C,再用苹果的编译器编译成可执行程序。这种方式你可以说它烂,也可以说它强,但是存在即为合理,不是所有人都能看明白Objective-C,但是几乎 所有人都能看明白Basic。

看了Objective-Basic提供的例子你会发现,真的就是Objective-C的Basic版,所有的框架调用,声明都和Objective-C那么相像,甚至—-它的UI编辑器就是苹果的Interface Builder。

可是麻烦就麻烦在这里,Objective-Basic没有很好的把IDE和界面编辑揉在一起,你得想办法自己搞定。而最让人痛心疾首的是,要建立 一个自己的工程,你得把它提供的例子复制一个,在它的基础上改……否则的话有你好看,因为你会立刻得到一个(或是几个)错误提示。

而Objective-Basic超好的地方也是它的语法转换。你如果真的非常熟悉Basic,看看例子,里面甚至带有一个俄罗斯方块,也许你还能 写出基于Core Animation的动画界面。它会自动帮你从basic文件中生成同名的.m文件,这些.m文件还算容易读,你都可以把生成好的源代码加到你的 XCode项目里。对于Objective-C新手来说,它可以当做一个从Basic到Objective-C的教学工具来用,真的。

好或是不好,自己来衡量,而衡量标准是用了才知道。今年中旬Objective-Basic又要发行一个新版本,如果它在易用性上多下点工夫,也许真会是一个值得一用的东西。

Mono

史书记载:啤酒盖子说要有DOS,于是就有了DOS,他说要有Windows,于是就有了Windows,他说要有.net,于是就有了.net……

如果你爱.net更爱苹果,你也许需要一个Mono,作为一个跨平台的.net解决方案,mono提供了差强人意的苹果支持。正如Cygwin在 Windows所做的一样,很多聪明人始终通过极为复杂的手段将自己变成懒人。Mono也一样,因为它把.net弄到了unix平台上。

为什么聪明人聪明?因为他们喜欢偷懒。他们不想写重复的代码,而仅仅为了在不同平台上跑,于是他们多写了很多代码去实现成为懒人的梦想。Mono里面自带的Cocoa#就是这么一个玩意,它甚至连取名字都体现了慵懒的聪明,聪明地把Cocoa和#放在了一起。

这套开发框架里面还懒惰地包括了一个界面看起来像windows的苹果可执行程序,是一个不那么好用的MonoDevelop。不要指望它能帮你做太多事情,如果你希望在苹果中编写.net程序,最终结局还是要用XCode。

在苹果中使用Mono还是有一点好处的,你在分发程序的时候,其实可以不用附带那么大的Mono安装包,而可以仅仅把自己需要的库打包一起放进执行程序的目录里。

KDE for Mac

你们向往自由,所以你们喜欢Linux。我们喜爱优雅,所以我们选择苹果。那么KDE for Mac是不是真的能让你享受优雅的自由呢?

其实KDE并不是一个开发工具,而是一整套桌面函数库。自由的世界往往是很多人向往的,所以KDE上的桌面程序很多。KDE for Mac可以让你把从前Linux上的程序搬到苹果上,而且界面看起来和Mac一样。这其实很棒,真的。

可是最无聊的事情是他们提供了KDE for Mac却没提供KDevelop for Mac。这可能意味着大部分情况下你需要用vi或是别的什么编辑器去编写代码了。如果你想用KDevelop干点什么坏事,你还得弄个Linux……

 

好了,看了这么多,你应该是时候仔细花点时间,好好看看XCode了。

Bookmark and Share

Quartz Composer基础教程

This item was filled under [ iPhone学习 ]

作者:superzhou

Quartz Composer-简单的说是一个强大的动画合成软件,是Apple在10.4Tiger的开发软件包中自带的.功能齐全,不许要写一行的编码就可以做出非常复杂的动画。
可以输出到Interface Builder给程序用,也可以做成屏幕保护,或者输出Quicktime.

使用的时候需要一下配置
1最好10.4.4以上
2最好有支持Core Image的图形卡,没有也行
3下载并安装了TIGER XCODE的SDK
4.一点基本的英语能力

以下是用Quartz Composer弄屏幕保护的简单教程。

 
首先,打开Quartz Composer,该程序位于/Developer/Applications/Graphics Tools/

打开程序后不要用模板,直接new一个空白的。
大概如图

在左边的Patch library里面选Renderer Clear, 双击加入你的动画中。
一个patch一般会有输入,输出参数。Renderer Clear只有输入参数,
因为他是输出到屏幕/viewer的
Renderer Clear的功能是在动画中加入颜色。选择这个patch,
用上面的按钮inspector可以修改他的参数,也可以双击参数前面的小圈。
在这里,我用的是黑色做底色,大家可以看到viewer里面漆黑一片….

下一步打算加点文字输出。  

如图,在patch library里面选 Image with string和billboard加入动画中。
前者是把文字输出到一个image中,后者的功能是把image输出到屏幕上。
修改前者的参数,可以改变字体,大小,文字内容等,
后者的参数决定了图像在屏幕里面显示的位置,颜色等。

我们要做的就是把前者的输出连接到后者的输入那里。
(如果联错了,双击输入方的小圈就可以断开)

view里面的能看到文字了,但是屏幕保护总是要动的  

那怎么让文字动起来呢?
办法就是修改billboard上面的X, Y position.
最简单的方法,就是给他们一个随机数值。
我们可以在左边的patch library中选Controller Random
拿两个出来,把他们的value输出连接到billboard上面的X, Y position

立刻我们就能看到文字动起来了。

(如果没有看到文字,看看billboard上面的数字,clear应该是1,billboard是2
如错了,右键单击其中一个,改rendering layer,这个数字确定了输出的顺序,
如果我们先写字再涂黑色,是什么都看不到的)

好了。
细心的人可能会发现,文字只在一个角落上跳跃。
这里介绍以下这个程序对屏幕坐标的定义,x轴的范围是-1到1,y也是。
所以我们需要修改random的最大最小值范围,从-0.8 到0.8
这样就完成了最简单的一个动画了。
用viewer看过没问题后,把文件存在用户下面的/Library/Screen Saver下面(如果想所有用户都能用,
就放系统的跟目录的Library,下面)这样OSX的屏幕保护设置就能够用这个屏保了。

这里只写了简单的介绍,很多功能以后再介绍吧….看看有没有人有幸趣再说。
apple网上有很详细的介绍,再developer目录下面的examples下面的Quartz Composer
目录里面有很多非常好的例子,找qtz文件打开就是了。
或者是看看模板,也有几个例子。另外,view有几个功能按键,缺省是隐藏的。
要注意的是,patch的边角是圆的,说明这个是基础的patch,如果是方边的
说明是 “宏”,里面是一堆patch,需要进去看详细实现方法的。

Bookmark and Share

谈谈XCode代码自动完成Code Sense功能及XCode界面设置

This item was filled under [ iPhone学习 ]

目前关于XCode代码自动完成方面的文章很少,在这里谈一下自己对于XCode code sense功能的理解。本文相对详细地介绍这方面的功能。

对于XCode的初学者来说,尤其是用惯了Windows下开发软件或Java的某些IDE的初学者,可能上手会非常不习惯,很可能觉得苹果自带的开发工具很烂,不好用。其实这一问题主要是因为缺乏相关文档说明,很少有人会告知这东西怎么用造成的。

这些不习惯主要是以下两个原因造成的:

一、代码提示及自动完成功能。

微软、Borland及一些Java的IDE都提供了很好的代码提示和自动完成功能,包括Mac下的RealBASIC也提供了比较易用的代码完成功能。其实XCode中也提供了这样的功能,如果你了解如何对其进行配置和使用,其实很容易上手。

二、界面习惯。

XCode在编辑源代码的时候,默认的编辑器界面是打开多个文档在多个窗口,虽然可以使用Exposé在不同的窗口选择,可是如果窗口打开太多也会很难受。其实XCode也提供了这方面的设置。

本文针对这两点提供一些配置方面的介绍。

 

一、代码提示和自动完成

XCode的代码提示叫做Code Sense,你可以按command+,在设置中修改这些设定:

设置完成之后,输入关键字,代码自动完成就会打开,如下图所示:

比如你输入NSBun,后面dle的提示就会自动出现。这时如果按TAB键,就会自动帮你输入NSBundle。

在常用的其他IDE工具中,相关的方法提示是这样的,比如在微软的Visual Studio中,你希望得到Form1中所支持的方法,你只需要输入

Form1.

按了点(.)之后,相关的方法就会出现在列表中,其实XCode也支持这样的列表,但是需要通过热键激活。

比如我们希望获取NSBundle相关的消息提示,只需要在空格后面按热键:ctrl+ESC或者ctrl+, (逗号键),提示就会出来了。

同样,带有properties的属性可以在.(点属性)后面通过按ctrl+ESC或者ctrl+,激活提示列表。

可是比较头疼的是,这里列出了太多相关不相关的方法、属性等等等等。在里面寻找需要的实在是太麻烦了。其实XCode还有另外一个热键,可以获取到 比较相关的方法(就是你可能需要的)。这个热键是ctrl+. (点键),在空格后面按这个热键,就会出现你最可能需要的消息或者方法的提示。连续按此热键这些提示就会循环出现。如下图所示。

有些情况下,某些方法会带有多个不同的参数,通过按ctrl+/ (斜线键),就可以在不同的参数之间切换了。

如果习惯了这些热键的用法,相信你也会觉得XCode的代码自动完成功能其实并不差吧。

二、界面习惯。

其实XCode的Layout设置里,提供了一个All-In-One的选项。关掉当前所有打开的文档,在这里选择All-In-One,你会发现IDE界面有所改变,如下图所示:

把这个窗口最大化,怎么样,有点开始习惯了吧?这个界面配置将源码显示在屏幕下方。这样,你只要在上方或者左侧列表选择一个源文件,就可以直接在下面编辑了。是不是比打开一大堆窗口方便得多了呢?

Bookmark and Share

关于Objective-C 2.0 的垃圾收集

This item was filled under [ iPhone学习 ]

Objective-C 2.0最大的增强可能就是垃圾收集了(Garbage Collection)。与“垃圾收集”对应的是传统的引用计数(Reference Count)内存管理形式。

 

使用了垃圾收集意味着大部分情况下这篇文章所介绍的工作你在程序中都不需要做了,系统会自动帮你管理好这些问题。如果你没有阅读过这篇介绍内存管理的文章,请先阅读一下。否则你可能不知道“垃圾收集”说的到底是什么。

 

另外,iPhone的操作系统目前并不支持垃圾收集,如果你希望做iPhone开发或者希望你的程序在未来移植到iPhone,尽量不要在程序中使用垃圾收集。 

 

什么是垃圾收集?

 

简单说来,垃圾收集可以被认为是“自动内存管理”的意思,就是说内存中不再使用的对象会被称做“垃圾”,垃圾收集的作用就是帮你自动释放掉这些“垃圾”以免程序占用过多不必要的内存。

 

传 统的内存管理形式本站已经有所介绍了,所谓垃圾收集主要用于解决内存泄露问题。当你手工建立一个对象,而没有在不需要的时候释放它,那么它就保存在内存当 中。如果创建了很多对象,那么就需要占用很多内存。少量的内存泄露不是很大的问题,但是当没有释放的内存过多时,就会出现很大的问题了,比如程序运行缓 慢、占用内存过大等。 如果你程序在持续运行,这些对象如果没有在不需要的时候被释放,那么它们就会慢慢“吃光”你的内存。

 

垃圾收集对于不知道如何管理内存,但是具有很多好点子并且能够动手编写一定程序的人尤为有用。因为他们可以忽略掉麻烦的内存管理,而把大部分时间关注于如何实现一个可以跑起来的好点子。

 

如何使用垃圾收集?

 

在项目设置中打开垃圾收集选项即可。

说明

 

以下介绍关于Objective-C 2.0垃圾收集(简称GC)的几个关键点。

 

1 由于垃圾收集包含在Objective-C 2.0 runtime库里,所以如果你的程序使用了垃圾收集,那么只能跑在Leopard及以后版本上。

 

2 默认XCode是会关闭GC的,要打开的话需要修改项目的Build选项。

 

3 gcc打开垃圾收集的参数是:-fobjc-gc

 

4 Core Foundation对象也同样支持垃圾收集

 

5 打开垃圾收集后,retain、release和autorelease将不再工作。但是如果你的程序中包括这些内存管理方法,打开GC并不会影响你的程序。

 

6 如果你的Objective-C 程序和C、C++共存,那么你可以在用Objective-C的时候不考虑内存释放,但是在C或者C++时还是必须考虑内存释放的问题。

 

7 如果在打开垃圾收集的情况下明确需要释放某个对象,使用-finalize方法。

 

8 苹果建议最好不要同时支持垃圾收集和传统的引用计数,虽然编译器允许这样做。

 

 

垃圾收集的好处:

 

1 对懒人或者初学者来说,你可以不用再考虑对象是否释放和什么时候释放。这意味着你可以节省更多时间,同时减少出错和内存泄露的可能。

 

2 当时间推移,由于减少了很多工作量和学习门槛,可能会有更多Java或者其他开发人员转入Objective-C开发。

 

3 使用旧的引用计数内存管理方式的程序不会因为打开了GC而受到任何影响。

 

4 如果开发多线程程序,相比从前手工进行内存管理更加简单。

 

垃圾收集的坏处:

 

1 如果你想让程序兼容Tiger,那么你就没法使用垃圾收集,还是要用引用计数的形式编写程序。

 

2 可能的性能降低。如果你使用过Java,你可能会对垃圾收集对性能的影响有所了解。不过这仅仅是坏处之一,因为大部分情况下你是不会感觉到使用了GC的程序有什么速度变慢的问题。

 

3 如果你希望某个对象长期保存而不被释放,可能需要将其做为全局变量。

 

4 正如本文前面提到的,iPhone并不支持垃圾收集。如果你希望程序未来兼容iPhone,那么不要考虑使用垃圾收集。

Bookmark and Share

Objective-C 2.0之前需要了解的:关于Obj-C内存管理的规则

This item was filled under [ iPhone学习 ]

Objective-C 2.0增加了一些新的东西,包括属性和垃圾回收。那么,我们在学习Objective-C 2.0之前,最好应该先了解,从前是什么样的,为什么Objective-C 2.0要增加这些支持。

这一切都跟Cocoa内存的管理规则有关系,我们知道,Objective-C中所有变量都定义为指针。指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址,如果使用不当,就会出错或者造成内存的泄露。要了解这些,就需要看看其内存管理的规则到底是什么样的。

这篇文章也应该做为苹果开发工具中提供的性能调试工具Instruments使用前必读知识进行阅读。Cocoa China将在稍后提供Instruments工具的使用方法,以及Objective-C 2.0的详细介绍。

要知道,如果你使用Objective-C 2.0,那么本文描述的大部分工作你都不需要自己去处理了。但是这并不意味着你可以不了解它,相反,只有你对内存管理规则更加了解,你才能更好地使用Objective-C 2.0带来的便利。

本文原文作者是Mmalcolm Crawford,原文地址 这篇文章翻译起来比较晦涩,希望您能看得懂。

当Cocoa新手在进行内存管理时,他们看上去总是把事情变得更为复杂。遵循几个简单的规则就可以把生活变得更简单。而不遵循这些规则,他们几乎一定会造成诸如内存泄露或者将消息发送给释放掉的对象而出现的的运行错误。

Cocoa不使用垃圾回收(当然,Objective-C 2.0之后开始就使用了),你必须通过计算reference的数量进行自己的内存管理,使用-retain, -release和-autorelease。

方法描述

-retain

将一个对象的reference数量增加1。

-release

将一个对象的reference数量减少1。

-autorelease

在未来某些时候将reference数量减少1.

-alloc

为一个对象分配内存,并设置保留值数量(retain count)为1。

-copy

复制一个对象,并将其做为返回值。同时设置保留值数量(retain count)为1。
保留值数量规则

1 在一定的代码段中,使用-copy,-alloc和-retain的次数应该和-release,-autorelease保持一致。

2 使用便利构造方法创建的对象(比如NSString的stringWithString)可以被认为会被自动释放。(autoreleased)

3 在使用你自己的参数实例时,需要实现-dealloc方法来释放。
例子

-alloc / -release

- (void)printHello

{

NSString *string;

string = [[NSString alloc] initWithString:@”Hello”];

NSLog(string);

// 我们用 alloc 创建了NSString,那么需要释放它

[string release];

}

便利构造方法

- (void)printHello

{

NSString *string;

string = [NSString stringWithFormat:@"Hello"];

NSLog(string);

// 我们用便利构造方法创建的NSString

//我们可以认为它会被自动释放

}

永远使用存取方法

虽然有时候你可能会认为这很麻烦,但是如果你始终使用了存取方法,造成内存管理问题的麻烦将会降低很多。

如果你在代码实例的参数中频繁使用-retain和-release,几乎可以肯定你做了错误的事情。
例子

假设我们希望设置一个Counter对象的数量值。

@interface Counter : NSObject

{

NSNumber *count;

}

为了获取和设置count值,我们定义两个存取方法:

- (NSNumber *)count

{

return count;

// 无需retain或者release,

// 仅仅传递数值

}

- (void)setCount:(NSNumber *)newCount

{

// newCount值会被自动释放,那么我们希望保留这个newCount

// 所以需要在这里retain。

[newCount retain];

// 由于我们在这个方法中仅仅改变了计算数量的对象,我们可以在这里先释放它。因为[nil release]在objective-c中也是允许的,所以即使count值没有被指定,也可以这样调用。

//我们必须在[newCount retain]之后再释放count,因为有可能这两个对象的指针是同一个。我们不希望不小心释放它。

[count release];

// 重新指定

count = newCount;

}

命名约定

注意存取方法的命名约定遵循一个模式: -参数名 和 -set参数名。

遵循这一约定,会使你的代码可读性更强,而且,更重要地是你可以在后面使用key-value编码。(参阅NSKeyValueCoding协议)。

由于我们有一个对象实例参数,我们必须实现一个释放方法:

- (void)dealloc

{

[self setCount:nil];

[super dealloc];

}

假设我们希望实现一个方法重置计数器,我们会有很多选择。在最开始,我们使用了一个 便利构造方法,所以我们假设新的数值是自动释放的。我们不需要发送任何retain或者release消息。

- (void)reset

{

NSNumber *zero = [NSNumber numberWithInt:0];

[self setCount:zero];

}

然而,如果我们使用-alloc方法建立的NSNumber实例,那我们必须同时使用一个-release。

- (void)reset

{

NSNumber *zero = [[NSNumber alloc] initWithInt:0];

[self setCount:zero];

[zero release];

}
常见错误

在简单的情况下,以下代码几乎一定可以正常运行,但是由于可能没有使用存取方法,下面的代码在某些情况下几乎一定会出问题。

错误-没有使用存取方法

- (void)reset

{

NSNumber *zero = [[NSNumber alloc] initWithInt:0];

[count release]

count = zero;

}

错误-实例泄露

- (void)reset

{

NSNumber *zero = [[NSNumber alloc] initWithInt:0];

[self setCount:zero];

}

新建的NSNumber数值数量是1(通过alloc),而我们在这个方法里没有发出-release消息。那么这个NSNumber就永远不会被释放了,这样就会造成内存泄露。

错误-对已经释放的实例发送-release消息

- (void)reset

{

NSNumber *zero = [NSNumber numberWithInt:0];

[self setCount:zero];

[zero release];

}

你随后在存取count的时候在这里就会出错。这个简便构造方法会返回一个自动释放的对象,你无需发送其他释放消息。

这样写代码意味着,由于对象已经被自动释放,那么当你释放时,retain count将被减至0,对象已经不存在了。当你下次希望获取count值时,你的消息会发到一个不存在的对象(通常这样你会得到一个SIGBUS 10的错误提示)。
经常造成混淆的情况
数组和其他集合类

当对象被加入到数组、字典或者集合中,集合类会将其保留。当集合被释放的同时,对象也会收到一个释放消息。如果你希望写一个建立数字数组的例子,你可能会这么写:

NSMutableArray *array;

int i;

// …

for (i = 0; i < 10; i++)

{

NSNumber *n = [NSNumber numberWithInt: i];

[array addObject: n];

}

在这个例子里,你无需保留新建的数值,因为数组会帮你保留。

NSMutableArray *array;

int i;

// …

for (i = 0; i < 10; i++)

{

NSNumber *n = [[NSNumber alloc] initWithInt: i];

[array addObject: n];

[n release];

}

本例中,在for循环里你需要给n发送一个-release消息,因为你需要始终在-alloc之后将n的数量保持为1。这么做的原因是当其通过-addObject:方法被添加至数组中时,数组已经将其保存起来。即使你释放了n,但是这个数字由于已经保存在数组里,所以不会被释放。

为了了解这些,假设你自己就是编写数组类的人。你不希望接收的对象未经你同意就消失,所以你会在对象传递进来时,对其发送一个-retain消息。如果他们被删除,你同时也要对应地发送一个-release消息。在你自己-dealloc时,你也要给你收到的所有对象发送一个-release。

Bookmark and Share
Page 1 of 212»