[iOS]iOS开发初学者记录

2012-2-6 评论(4) 分类:技术文章 Tags:

做完了项目,想总结下,不知怎么写合适,只列出一些iOS开发的基础点,开发前因为不知道这些点,导致走了一些弯路,希望对初学者有帮助。

基础篇

为什么对一个变量release后还要设为nil

对一个变量release后,这个变量指向的内存释放了,但这个变量本身没变,仍指向原来的内存地址。若这个变量在释放后被访问,或者被重复release,就会导致应用崩溃。设为nil后这个变量指向0x00,可以保证程序以后访问不到原先的内存地址,对nil进行release也没任何问题。

使用类成员时,前面加不加self.有什么区别

不加self.调用的是成员本身,加self.后实际上调用了其成员的get set方法。
例:

//.h
@property (nonatomic, retain) NSString *name

//.m
name = @"bang";  //没有retain,随时会被释放
NSString *str = self.name  //等于NSString *str = [self name];
self.name = @"bang"; //等于[self setName:@"bang"]; 这时在set方法里retain了这个字符串

技巧篇

内存泄漏

可以通过xcode的编译工具Product-Analyze检查函数块范围内可能的泄漏点(外带会提示一些可能有的错误)。

用leaks工具监测出来的泄漏查找方法是跟踪其代码提示中出现的变量,经常这个变量是在提示的调用堆栈以外的地方泄漏的。若实在查不到,最终办法是重写这个变量的retain和release方法,debug,从调用堆栈看是谁retain了它而没有release。

要注意的是,用CFXXCreate(例如CFArrayCreate)生成的变量要用CFRelease释放。

数据存储

如无搜索需要,可以将一个数据对象直接序列化后存到sqlite,取出时直接反序列化为对象使用。序列化需要数据类实现NSCoding协议,实现encodeWithCoder和initWithCoder两个方法就行,若有多个数据对象,可以写个基类实现这两个方法,并在这里面利用反射枚举自身所有变量去encode和decode,一劳永逸,具体实现网上找找就有了。

组件篇

UINavigationController头尾显示隐藏

在用NavigationController去管理view的push和pop时,需要根据不同的view设置是否显示NavigationBar和ToolBar,一开始在错误的地方设置了,导致有时该显示NavigationBar和ToolBar时不显示的情况,后来发现在viewWillAppear上设置万无一失。别笑我土鳖,没好好去理解它整个流程,一直没发现。

- (void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self.navigationController setToolbarHidden:NO];
    [self.navigationController setNavigationBarHidden:NO];
}

UITableView游标式渲染

tableView的机制大概是:先定好总行数,某一行滚入视图范围时,回调一个函数去取view出来显示。这一行滚出视图再滚入时仍会继续回调这一函数取view。有这样的机制就是说无论你table里的数据有多少,都可以全部放入table中不用分页,因为不用一次性把所有数据都取出来,只在需要显示的时候根据游标去取对应的数据就行了。

可能这是APP组件很自然的方式不用说明,但在web上页面上的数据和元素都是要一次性载入内存的,做久了web,一开始没想到它这样的实现机制,导致我们走了不少弯路。

UIWebView渲染范围

UIWebView不是根据可视范围决定每次的渲染范围,而是根据自身控件的frame大小决定。

曾尝试webview嵌在tableview里,为了让webview跟tableview一起滚动,把webview的大小设为webview里的内容大小,让webview不出滚动条,从而能跟着tableview的滚动条一起滚。这样做的后果是每次webview都一次性渲染整个页面,内存占用多性能很差,而且在放大缩小这个webview时,渲染放大的整个页面更吃力,出现不能忍受的性能。解决办法是让webview定住高度为一整屏iphone的高度,限制了webview每次的渲染范围为可视范围,性能大好。带来的问题是无法随tableview滚动,但可以以其他方式优化体验。最近看到新版的ZAKER也是这样做的。

个人感觉篇

界面布局调整非常麻烦,让人怀念web了。界面描述方法XIB感觉晦涩难学,至今不会,没有CSS+HTML来得方便。

有编译器把关,少了像写js时多写or写错一个字符查半天的问题。

Object-C写起来各种变量函数和变量调用很长,没有js的短小精悍来得爽。

第一次编写涉及手动内存管理的程序,挺有意思,没想象中难,但有些内存管理导致的bug很难查。

虽然APP不像web那样随时更新,但也不像传统PC客户端升级那么麻烦,用户更新意愿更强,还是适合快速迭代的。

细节是可以决定成败,但得看你把什么定成细节。

最后,0bug的程序不存在,极致是把最主要的事做好。done is better than perfect。

伊书 – 苏菲的世界

2011-12-7 评论(8) 分类:作品 Tags:

伊书 – 苏菲的世界

介绍

距上次我在新浪微博发”I got an idea“已经过去快一个半月了,现在终于把这个idea完成了。

其实也不算idea,只是想认真地做一本针对iOS的电子书,webApp方式,最好精致点,取名伊书。

伊书是电子书,一本书一个APP,用webApp方式实现,打开浏览器,添加到屏幕,即可完成整本书的下载,随时离线浏览。伊书有以下特点和功能:

  1. 最基本的点击左右两侧滑动翻页
  2. 手指滑动拖动页面,在低版本的iPhone上性能会差一点,iPhone4以上较流畅
  3. 注释功能,点击正文上的注释按钮显示注释内容。
  4. 底部红条显示当前章节的进度,按住可以显示页码,拖动可以快速翻页。
  5. 夜间模式
  6. 排版:
    iOS5以上支持左右对齐的justify排版,iOS4以下不支持。
    书信开头的左顶格,落脚的右对齐,引用内容的。
    标点悬挂,将出现在行首的标点提前到上一行末。
  7. 当然它是离线的

历程

想起2001年有个网站叫E书时空(这个网站竟然还存在),提供电子书下载,一本一个exe文件,设计良好,很喜欢。想来我特别喜欢那种包装起来成一个完整个体的东西,像一本本电子书,一个个iPhone APP,还有一个个完整的FLASH游戏。像我以前做的Q版海底俄罗斯这个FLASH游戏,特别喜欢打造这样一个完整东西的感觉。

我是看到“唐茶”才想起这些的,非常喜欢唐茶这样的APP,很有苹果的风格,阅读体验上追求完美,确实是阅读新境界。手机阅读随时随地,我自己也在手机上读了不少书,自身需求较大,我想用自己的方式去实现一个。我没见过有人用web的方式做这样的电子书,算是实验尝试,也算是自娱自乐的项目。

第一本书我选择了《苏菲的世界》,觉得它很好,以非常轻松的方式让人了解整个科学哲学史。这部书原版出版于1991年,按理来说至今20年已经没有版权问题了,但翻译的版权还是存在的,所以这还是算盗版吧。整本书的内容是在网上找的,内容有非常多的错误,我见到的都一一修改了,光改内容已经花了我很多时间,相信这是网上能得到的版本最好错误最少的《苏菲的世界》。

工作后做业余项目真是不容易,时间太少,娱乐时间大部分都贡献出来了,有时是乐在其中,有时不得不去做琐碎的事情,不得不去做不擅长的设计,也是有点辛苦的。设计对我来说是个难题,设计的过程是憋出来的,一点点试出来,比较痛苦,很想自己的设计能力能提高,但很难,也很想跟好的设计师合做一个产品。

这个产品从80%到100%花了挺长时间,产品发布的页面都做了,还有在safari打开时针对高清屏的优化,总的来说,这次还是比较用心的。这样的产品,做出来感觉很快乐,但如果有人用,可以增加百倍的快乐,希望有人会喜欢吧。

iPhone webApp缺陷

苹果对webApp支持力度较大,在移动端对HTML5,对webApp支持得最好的就是iOS了,但它还是有很多缺陷。

  1. 无法阻止屏幕旋转
    只能做一个在旋转到横屏时提示“不支持横屏”的提示。
  2. 无法正常切换任务,一切换就重刷页面
    原生APP从后台切回来直接恢复状态,webApp跟iOS时代的APP一样,一切走,再切回来,就是重启应用。
  3. 不能调节亮度
    这个还可以接受,只是在阅读时比较需要这样的接口。
  4. 图标和开启页面无法使用manifest缓存
    manifest无法管到APP的图标和启动图片,每次打开应用都会去请求这两张图片。
  5. 头部状态栏无法去除
    少了一些宝贵的显示空间
  6. 性能
    iPhone4S上性能给力很多了。但是,原生APP可以流畅实现更炫的效果时,webApp不过是刚好能实现简单效果。

iphone webapp:模拟tweetie

2010-7-3 评论(2) 分类:作品 Tags:

img_0026

地址:http://cnbang.net/lab/tweetie (桌面浏览器只支持safari/chrome)

IPhone Safari不支持position:fixed,这点很麻烦,一般读取内容的app都是头部和尾部固定,中间内容滚动这样的形式,而在web上没有了postion:fixed这个功能就没法这样做了。有人针对这个问题做了hack,iScroll做得很好,效果很平滑,甚至连旁边的滚动黑条都模拟了,还支持android和桌面浏览器,真是好东西。想拿它做个东西试试。

想实现tweetie里拖动刷新推的效果,于是对iScroll进行了小小修改,options里增加了edge参数,即设置哪里是边界。再用自家的iquery开始试着实现。

实现过程发现IPhone Safari性能还是挺差,一不小心就会变得很卡,例如:
1.头部放个会动的loading图片就会让整个滚动变得很卡,不得不去掉换成不动的loading图。
2.头部箭头翻转如果设置了动画转动,就会卡大约半秒才开始转动,不得不去掉这个效果。

结果现在的效果并不好,拖动刷新的过程没有原版tweetie那么流畅,不知还有没有优化的空间。

做这样内容式的webapp相对于原生APP来说,除了性能差点,还有一个缺点,就是webapp无法直接获取远程数据(跨域问题),除非用jsonp,像获取twitter数据这些,得在本地搭个类似代理才行,多了个服务器流量。

没有android可以测试这个应用,不过应该是支持android的~要是tweetie没被twitter收购,这东西可能还有做下去的价值,现在似乎就没啥价值了,就不继续做下去了~只是演示下效果。

另,在IPhone/ITouch上webapp真是二等公民,实在没法跟原生APP相比,不知道在IPad上情况怎样,有机会真想试试~

jQuery for Iphone: iQuery

2010-6-16 评论(2) 分类:作品 Tags:

img_0015 img_0017

仿照jquery的API写了专用于iphone的jquery,索性叫iquery。虽然API很多一样,但里面的实现大多不一样,sizzle引擎改成了现代浏览器自带的queryselector,其他API很多实现上是简化了,很多并不常用的方法和功能没加上,增加了iphone特有的touch等事件,详细看文档。因为内部实现是自己写的,又没有经过很多测试,所以还不能像jquery那样随心所欲地用不怕出错,还拿不出手,只能自己用,打算边用边测试,先放上源码和文档。

文档同时也算是iquery的使用演示。建议在iphone/itouch下查看,同时还可以挺好地支持电脑上的chrome和safari,其他浏览器不行~

P.S 目前文档还有很多方法没有加上详细说明

文档:http://tiny.cc/iquery

源码:http://code.google.com/p/bangswork/source/browse/trunk/iquery/iquery.js

目前压缩前17.8K,压缩后9.4K

IPhone Webapp:手尺

2010-6-7 评论(3) 分类:作品 Tags:

handruler_cover handruler_ctn

简介

测量手指比划距离的工具,两手指放在屏幕上,即会显示出两手指之间的长度,单位为厘米。

需要使用iphone/itouch打开并添加至主屏幕,才能开始使用,因为只有添加到主屏幕才能全屏运行。

应用地址:http://tinyurl.com/handruler

开发

一直很想开发iphone应用,还没试过开发用手指交互的应用,想想比开发一般的应用要爽。可惜想开发iphone应用得花很多本钱,首先买个mac,再买个$99/年的证书,我买个itouch都很费劲了,当然折腾不起。于是,转向webapp。

似乎开发iphone webapp的比较少,网上资料少,我想找iphone浏览器里多出了哪些事件,怎么全屏怎么离线缓存等都找了半天,后来在http://dedy.tv/看里面应用的源码直接偷过来了,但还是费了些周折。浏览器多出的事件也在这里找到了,真费劲。

于是先做了个小小的应用练练手,开发的第一个用手指交互的应用,虽然可能用处不大,但感觉爽,哈哈。

有空再写写开发iphone webapp跟普通网页应用的不同点。