乳头根部开裂了图片:【讨论】对《iPhone & iPad开发实战》我个人的一些看法 [文字模式]

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 01:10:48
CCF技术论坛 > 软件 > 『程序员之家』 > 【讨论】对《iPhone & iPad开发实战》我个人的一些看法
PDA

查看完整版本 : 【讨论】对《iPhone & iPad开发实战》我个人的一些看法


s56894122010-12-01, 14:07因为想在iPad上写点小东西,所以搜了下和iPad有关的开发书籍,发现了一本国人孙东风编著的《iPhone & iPad开发实战》,看名字还行,而且日期也挺新的,就买了,下面是我个人看了一部分内容之后的看法和意见,希望有熟悉Mac或者iOS开发的TX进来指正讨论,让我能学习进步,再交代我个人的技术背景,01年毕业之后一直在Windows上用C++开发,自认为技术和学习能力都还行,今年初曾经用一个多月时间开发了一个Mac平台下的网络配置工具,对Mac平台、XCode和ObjC有基本了解,闲话少说,正文开始。

首先是书名,可以说我就是冲着里面有iPad几个字才买的,没有的话铁定不会买的,但是到手之后发现整本书没有任何与iPad直接相关的内容,作者在前言里写到“在笔者写作此书的时候,恰好iPad横空出世,因为iPad和iPhone是使用统一的SDK以及软件开发环境,本书中适用于iPhone开发的知识也同样适用于iPad开发,为了简洁起见,本书统一使用iPhone来代指iPad和iPhone两个平台。”然后书的主要内容就是四个iPhone实际开发项目,我勒个去,照这样的说法,Windows Internal可以取任何和Windows有关的书名了,反正里面的知识同样适用于Windows的方方面面,在他的博客上也有人提出了这个问题,我都懒得打字了,截图看看吧,我真想说“见过XX的,没见过这么XX的。”

554817

好了,书名说完了,接着来说书的内容,整本书也还没看完,后面那几个实战项目都偏实用的,出错也就是一些细节,不会有方向上的影响,我就拿前面讲iPhone平台知识点的内容来说吧,具体是内存管理,因为这些东西是基础,如果是新手看了,理解上出了问题,影响的不是几行代码,而是整个的知识框架,以后要改可能就麻烦了。

“在使用这些资源的时候,比如打开一个文件句柄,那么在使用万这个文件句柄后就需要开发人员自己关闭文件句柄,否则就会产生资源溢出。”
恕我愚钝,在我有限的Mac平台编程经验中,没有资源溢出这个词汇,在Windows上出现这种问题,那都叫资源泄漏,resource leak,溢出给人的第一感觉是多了,漫出来了,让一个新人看到会不会觉得奇怪呢,资源被使用了没关闭,反而变多了?请Apple开发达人指教。

在每一个对象出生之后,编译器都会分配一个整数来记录这个对象被引用的次数......
当一个对象的引用对象(这里应该是引用计数才对,还发现了一个笔误)为0时,Objective-C编译器会自动发送dealloc消息给该对象......
看了这几句话,我的Windows经验让我简直火冒三丈,什么时候编译器和运行时的对象还能产生关系了,Apple开发应该都是用的GCC,但是不管你用什么编译器,编译器也没责任在你的程序运行的时候还来掺和一脚啊,如果我说的有错,还是请Apple开发达人指正。

最后再请教一个问题:
copy和retain这两个方法在使用上有什么区别吗?
书里举了两个例子:

-(void) setName:(NSString*)newName
{
[name release];
name = [newName copy];
}
-(void) setObject:(Object*)newObject
{
[object release];
object = [newObject retain];
}

这里一会用copy,一会用retain,但是看起来没什么区别(我能看出的区别就是一个NSString,一个Object)啊,如果我自己写类的话,用copy还是retain呢?
书里还说“对于类的实例变量来说,它的引用计数应该总保持在1”,这是为什么?

觉得这本书不好之后,我就继续在网上搜了一下,发现了一个博客,里面正好有两篇讲内存管理的文章,真是不比不知道,高下立判,给有志学习的TX留个链接吧
http://lichen1985.com/blog/?p=268
http://lichen1985.com/blog/?p=273

目前我个人对Mac平台的内存管理的看法是这样,是用引用计数来管理没错,不过每次产生出来的对象应该都是在系统的监控之下,这样的话就可以解释为什么要采用这种方式,因为Apple开发是把Windows下的函数调用叫做发消息,其实每次都是发消息给系统,然后系统来确定对象的生死,为什么实例变量引用计数总保持在1,也是因为在类的dealloc中,肯定只会release一次,如果引用计数大于1,那对象就不能释放了,造成泄漏,最后再恳请有空的Apple开发达人来批评指正,其他TX也欢迎讨论啊。

呼呼,写了这么多,感觉好多了,呵呵
lgazg2010-12-01, 14:11其实,出版社也是有任务的,至于图书的质量……
mwenyuan2010-12-01, 14:11看在线文档和 iTunes U 里面的那些视频教学就够了吧,其实看着文档和 sample 上手是最快的。

这年头文档看译本都是自找麻烦的。

此外作者说得方法很欠扁,但是要我回答的话事实如此,单一的 iPad 程序和 iPhone 程序开发如出一辙,几乎没有区别。倒是做 universal 的程序会遇到一些新东西。
s56894122010-12-01, 14:24看在线文档和 iTunes U 里面的那些视频教学就够了吧,其实看着文档和 sample 上手是最快的。

这年头文档看译本都是自找麻烦的。

此外作者说得方法很欠扁,但是要我回答的话事实如此,单一的 iPad 程序和 iPhone 程序开发如出一辙,几乎没有区别。倒是做 universal 的程序会遇到一些新东西。
这本书并不是译本,而是作者的经验之谈,正因为如此,所以我才冒火,能开发项目并不代表你的水平高,但是写书这种东西,自己的份量也不掂掂,拿出来不对的东西那可以算是害人啊。

对啊,连你也同意作者的话很XX,那我就不多说了。
Spark2010-12-01, 14:24有勇气! 国内砖家出的书也敢买敢看,呵呵
meet2010-12-01, 14:57真是岂有此理。欺骗读者之嫌!!不严谨!!!
Hanzac2010-12-01, 17:05编译器应该更正为运行时库

其实也没必要去纠缠细节,他本来就是写的开发实战,又不是讲原理、讲基础的,取点经验不就够了?
mwenyuan2010-12-01, 18:06copy 是对象复制,内存占用 * 2。

retain 是引用计数器 + 1,内存占用没变。

时间多的话还是看看 iTunes U 里面的 CS193P 吧,两个 Apple 的人讲得很好,主要是很多历史遗留问题说得比较透彻。
BlurEyes2010-12-01, 18:32在objective-c里,一般只读类型的类用copy(例如NSString, NSData),其他的用retain来保持对一个对象的有效引用。retain count大于1是没有问题的,而且基本上是不可避免的,只要保证有相应次数的autorelease或者release就不会有memory leak。对memory leak简单的可以用build and analyse来check(编译期检查),或者用instrument在runtime做分析。对于对retain count为0的object发message的check,可以设置zombie enabled来做runtime检查,记得在产品release之前去掉这个设置,这个巨耗内存。
gillbatez2010-12-02, 05:55在objective-c里,一般只读类型的类用copy(例如NSString, NSData),其他的用retain来保持对一个对象的有效引用。retain count大于1是没有问题的,而且基本上是不可避免的,只要保证有相应次数的autorelease或者release就不会有memory leak。对memory ......

高手,做个图文并茂的例子来说一下怎么instrument或者build n run 来检查吧:p大家都会受益的。
su992010-12-02, 08:28我咋觉得这个代码不对呢?如果把本身的值传进去应该会崩溃吧:

-(void) setName:(NSString*)newName
{
[name release];
name = [newName copy];
}
-(void) setObject:(Object*)newObject
{
[object release];
object = [newObject retain];
}


比如 self.name = self.name,不做检查就把同一个指针release了,如果刚好这个指针没有别人持有的话,接下来访问newName就会完蛋。正确的做法是先判断新旧指针是否相同,或者用autorelease延迟释放。没看这书,不知道是不是用这个例子来做反面示例。

copy和retain,从语法上看基本等同,同样取得对象的所有权。但retain是共享同一个指针,copy是另外分配了一份。一般对immutable(不可修改)对象如NSString, NSDictionary等来说,好象没有什么必要用copy。

还有,“对于类的实例变量来说,它的引用计数应该总保持在1”这个完全没道理吧。如果有别人也retain了这个指针那肯定就不是1了啊?总的来说内存管理应该重点放在“谁分配谁释放”这一原则上。引用计数参考意义不大,因为你不知道别人是不是还持有这个指针。
yinshunming2010-12-02, 08:37有的图书质量。。。。我不看了
mwenyuan2010-12-02, 09:17我咋觉得这个代码不对呢?如果把本身的值传进去应该会崩溃吧:[code]-(void) setName:(NSString*)newName{ [name release]; name = [newName copy];}-(void) setObject:(Object*)newObject{ [ob......

应该不会有问题的, property 的编译过后应该是 Call 右边的函数,再把结果传入 Call 左边的函数吧,而非一般赋值表达式的先计算一边并维持,再计算另一边后维持,最后赋值。

也就是 get 会比 set 先计算,这样 set 的时候 release 之前,get 里面 name 应该已经被额外的 retain 了一次。
yyyyy2010-12-02, 09:35最近也在研究obj-c,买了几本书来看

有c/c++基础的建议看《Objective-C基础教程》,翻译不错,lz关于内存管理的问题这本书里面讲的比较好
如果觉得讲得不够深入,就看apple出的《The Objective-C 2.0 Programming Language》,其中描述了很多内部机制如运行时的行为

iphone开发觉得《iPhone 3开发基础教程》还不错,虽然不是针对最新的sdk的,但是基本原理还是讲得比较清楚的

这几本书网上都有电子版
s56894122010-12-02, 09:50最近也在研究obj-c,买了几本书来看有c/c++基础的建议看《Objective-C基础教程》,翻译不错,lz关于内存管理的问题这本书里面讲的比较好如果觉得讲得不够深入,就看apple出的《The Objective-C 2.0 Programming Language》,其中描述了很多内部机制如运行时的行为ipho......
真是感谢,正想问问有经验的TX,请推荐书呢。
s56894122010-12-02, 10:01编译器应该更正为运行时库

其实也没必要去纠缠细节,他本来就是写的开发实战,又不是讲原理、讲基础的,取点经验不就够了?
我们是在讨论技术,不是讨论人情啊,有哪门技术不纠缠细节就可以学好的吗?我这里讨论的是书里存在的问题,不是说我没有从里面学到经验,水平高低不是问题,能分享经验更是值得感谢,但是对自己有不清楚或者没把握的,就不要讲,这样的东西著书立册那是害人啊。
su992010-12-02, 10:57应该不会有问题的, property 的编译过后应该是 Call 右边的函数,再把结果传入 Call 左边的函数吧,而非一般赋值表达式的先计算一边并维持,再计算另一边后维持,最后赋值。也就是 get 会比 set 先计算,这样 set 的时候 release 之前,get 里面 name 应该已经被额外的 retain......

应该会crash. Get是不会retain的。就是简单的return name;

写个小程序试试就知道了
s56894122010-12-02, 11:30在《Cocoa入门》这本书里面,作者推荐了先保持再释放的方式,并解释说即使新旧对象相同,也能够保证对象不会在保持之前被移除。
-(void)setProperty:(id)newProperty
{
[newProperty retain];
[property release];
property = newProperty;
}
mwenyuan2010-12-02, 11:35我咋觉得这个代码不对呢?如果把本身的值传进去应该会崩溃吧:[code]-(void) setName:(NSString*)newName{ [name release]; name = [newName copy];}-(void) setObject:(Object*)newObject{ [ob......
在《Cocoa入门》这本书里面,作者推荐了先保持再释放的方式,并解释说即使新旧对象相同,也能够保证对象不会在保持之前被移除。
[CODE]-(void)setProperty:(id)newProperty
{
[newProperty retain];
[property release];
......

CS193P 里面讲过对象的 lifecycle,可以去具体看看。
Dawn2010-12-02, 11:52我现在找书都是首先上amazon,然后google 书名+pdf+download
greatfox2010-12-09, 19:38也就是把编译器产生的代码和编译器混淆了一下,不用这么大火吧。
看书还是要顺着作者来的
lroc2010-12-10, 01:15也就是把编译器产生的代码和编译器混淆了一下,不用这么大火吧。
看书还是要顺着作者来的
这要看作者是脑子糊涂呢,还是一个笔误。
如果笔误太多,读者也只好认为他是脑子糊涂。

其实这倒无所谓。只不过,你能指望一个糊涂的人写一本清楚的书吗?
太阳公公2010-12-10, 16:06尽量买老外写的书,并且去amazon.com看看评价
我最近10年买的专业书籍(每年大概10本),只有一本是国内的原创书籍

国内的大部分书,你看了以后会发现:
写书的这两把刷子,水平还不如我呢

当然也不能一棒子打死,偶尔也能遇见水平过得去的书
aufstieg2010-12-11, 06:09建议楼主把这本书扔了吧. 其实去多去www.cocoachina.com看看就行了. 里面资源很多, 教程, 代码应有尽有. 会员都很热心.
greatfox2010-12-11, 20:09这要看作者是脑子糊涂呢,还是一个笔误。
如果笔误太多,读者也只好认为他是脑子糊涂。

其实这倒无所谓。只不过,你能指望一个糊涂的人写一本清楚的书吗?

买一本书,能学到1/10就不错了,何必非得全本都是精华。
既然读者自己概念很清楚,又何必在乎别人一时笔误。
换过来说,就算读者概念不清,那继续分不清编译时间和运行时间又有什么坏处呢。

反正我不会因为这些细节来评价一本书对自己有没有用或者是好不好。
lroc2010-12-12, 04:14买一本书,能学到1/10就不错了,何必非得全本都是精华。
既然读者自己概念很清楚,又何必在乎别人一时笔误。
换过来说,就算读者概念不清,那继续分不清编译时间和运行时间又有什么坏处呢。

反正我不会因为这些细节来评价一本书对自己有没有用或者是好不好。
那...如果你有很多时间读书(从而你不再意浪费时间)、每本书你不在意只学到一点点(因为你读了很多书,积腋成裘)、而且你可以从错误的描述中得到精华——这得假设你得到的误解不足以冲淡你的正解、甚至于你也不在乎自己概念不清........

那,如果你是程序员,请问你的编程能力是上等偏下,还是中等偏上?
s56894122010-12-14, 14:05买一本书,能学到1/10就不错了,何必非得全本都是精华。
既然读者自己概念很清楚,又何必在乎别人一时笔误。
换过来说,就算读者概念不清,那继续分不清编译时间和运行时间又有什么坏处呢。

反正我不会因为这些细节来评价一本书对自己有没有用或者是好不好。
意思是书上错的有道理,我去挑错本身还有错了?还有这么可笑的事情

买书本身就是为了学习,拿着一本不知对错的书,你学什么?你敢看吗?稍微极端点说,教材里面到处是错,会怎么样?老师讲的不清不楚,会怎么样?

为什么现在大家动不动都说老外的书如何如何,就是因为有这些质量低下的书害的,可以这么说,老外的书可以是内容很浅,但是不会有明显的硬伤。

写书实际上就是在给别人当老师,天地君亲师,难道一嘴瞎话误人子弟的老师你会真心的当他是老师?

现在黑白不分是非颠倒的人真是太多了。
gillbatez2010-12-14, 18:02意思是书上错的有道理,我去挑错本身还有错了?还有这么可笑的事情

买书本身就是为了学习,拿着一本不知对错的书,你学什么?你敢看吗?稍微极端点说,教材里面到处是错,会怎么样?老师讲的不清不楚,会怎么样?

为什么现在大家动不动都说老外的书如何如何,就是因为有这些质量低下的书害的,可以这么说,老外的书可以是内容很浅,但是不......

如果国内的人真有这个认识就好了。但实际情况是大多数中国学生偷老师的书来看,长此以往搞坏了整个产业链。身边不少朋友现在都直接投稿o'reilly了,以前么还在国内发发书。
greatfox2010-12-14, 20:41国内的书就这水平了,原材料的成本都差不多,为什么国内的书几十元人民币,国外的书几十美金。

既然选择了,就没必要大惊失色,好像过去一直生活在真空里一样。
lroc2010-12-15, 01:16国内的书就这水平了,原材料的成本都差不多,为什么国内的书几十元人民币,国外的书几十美金。

既然选择了,就没必要大惊失色,好像过去一直生活在真空里一样。
这倒是对的。候捷所提倡的高价优质,是很有道理的。
s56894122010-12-15, 14:12国内的书就这水平了,原材料的成本都差不多,为什么国内的书几十元人民币,国外的书几十美金。

既然选择了,就没必要大惊失色,好像过去一直生活在真空里一样。
如果我把书里的错误比做大米里的毒药,也许有人会说太严重了,那就比作奶粉里面的三聚氰胺吧,吃了也死不了人,如果按上面的逻辑,你只能买国产奶粉,那就活该得胆结石了,你要能吃原装进口奶粉,那就没事了,谁叫你不买进口奶粉呢?是吧。

再退一步说,三鹿当年卖了多少奶粉出去,肯定不是只有那些得了胆结石的孩子才吃过,难道要责怪那些得病的孩子身体不够好,消化不了三聚氰胺?类比来说就是即使有能够识别书里的错误的人,但并不代表你写的书里就可以随处都是错误。

钱少买到的书内容少一些,浅一些都可以接受,毕竟不是学不到东西,只是多少深浅而已,但是花钱买的书有如此之多的错误,就让人难以接受,而且还有人麻木的认为理所应当,就更是匪夷所思了,言尽于此,不再多说了。
netxray2010-12-15, 17:38这类电子书大把,我都直接看电子书。大多不用买了~~
另外,apple有一些教学视频可以看
greatfox2010-12-15, 20:27这要看作者是脑子糊涂呢,还是一个笔误。
如果笔误太多,读者也只好认为他是脑子糊涂。

其实这倒无所谓。只不过,你能指望一个糊涂的人写一本清楚的书吗?
如果我把书里的错误比做大米里的毒药,也许有人会说太严重了,那就比作奶粉里面的三聚氰胺吧,吃了也死不了人,如果按上面的逻辑,你只能买国产奶粉,那就活该得胆结石了,你要能吃原装进口奶粉,那就没事了,谁叫你不买进口奶粉呢?是吧。

再退一步说,三鹿当年卖了多少奶粉出去,肯定不是只有那些得了胆结石的孩子才吃过,难道要责怪那些得......

一般消費者沒能力鑒別奶粉中是否有三聚氰胺。

如果你把自己讀書的能力做此類比的話,只能說明你還沒掌握閱讀的能力。
lroc2010-12-16, 01:16一般消費者沒能力鑒別奶粉中是否有三聚氰胺。

如果你把自己讀書的能力做此類比的話,只能說明你還沒掌握閱讀的能力。
lz批评了这本书,不正是因为“掌握”了阅读的能力吗?
greatfox2010-12-16, 21:18lz批评了这本书,不正是因为“掌握”了阅读的能力吗?

掌握了阅读的能力还拿三聚氰胺做类比……问题更严重了。
难道是失去了思考的能力?
lroc2010-12-16, 23:09掌握了阅读的能力还拿三聚氰胺做类比……问题更严重了。
难道是失去了思考的能力?
你如果觉得这是个问题,那你得说明这个类比是如何的错误。
跳过证明过程到结果,的确有不少时候是推理太纯熟了,但也有不少时候是想当然的假设有错误。
你这句话我分不大清楚。
BlurEyes2010-12-17, 21:42国内原创的计算机书籍基本上没有一本是合格的,翻译的质量大多也不高,很难想象出版社会出这么多肯定会亏本的书。

看英文原版学习靠谱些,个人想学网上英文版的ebook也很容易找到,公司里还是到amazon上买正版吧。现在主流开发平台的学习资料不是太少,而是太多,看书也耗时间啊。

回到技术问题讨论上,内存检查在xcode的菜单里有两个工具:
1.Build -> Build and Analyze
2.Run -> Run with Performance Tool -> Leaks

第一个会检查一些不规范的写法,类似Lint,FxCop,checkman
第二个比较强大,在运行事能检测到object的retain,release发生的时机,并且能定位到相关的源代码。
lroc2010-12-17, 23:16很难想象出版社会出这么多肯定会亏本的书。


出版业也有个x:y:z原则,也就是有几成是赔的、几成是打平的、几成是赚的。和赌博有点象。
出书时他们并不预计每本书都会赚。出很多,只是指望某几本能够大赚。

据个人了解,现在仍然是靠领导拍脑袋来决定出什么书。没什么技术指导。

跟风比较严重。以前曾有无数的《从入门到精通》,而且最开始时还是捞了些钱的....现在流行什么内容我不大清楚。

另外,大概10多年前,清华出版社最早对计算机类图书实行了售后付款、滞销书退回的策略,减少了销售商的压力,但让出版社担了风险。
greatfox2010-12-18, 01:01……汗,真能信口开河

从来出版社和新华书店之间一直是先书后款,滞销书退回的,反正都是一家人。
只有九十后代后,二渠道慢慢合法化,允许私营书店从事批发业务后才分出各种不同的销售模式出来。

出版社一年这么多书怎么可能都由领导拍脑袋决定的,编辑部和各类挂靠的工作室才是主力。
lroc2010-12-18, 03:06……汗,真能信口开河

从来出版社和新华书店之间一直是先书后款,滞销书退回的,反正都是一家人。
只有九十后代后,二渠道慢慢合法化,允许私营书店从事批发业务后才分出各种不同的销售模式出来。

出版社一年这么多书怎么可能都由领导拍脑袋决定的,编辑部和各类挂靠的工作室才是主力。
当诚信之口打开时,外行信不信,其实不是个问题。要不然,也不会说隔行如隔山了。
Hanzac2010-12-22, 10:26我们是在讨论技术,不是讨论人情啊,有哪门技术不纠缠细节就可以学好的吗?我这里讨论的是书里存在的问题,不是说我没有从里面学到经验,水平高低不是问题,能分享经验更是值得感谢,但是对自己有不清楚或者没把握的,就不要讲,这样的东西著书立册那是害人啊。

麻烦你认清现实好不,国内的环境出不了精品的。他害你什么了?只要没有偏离当前的水准过多,那就没有问题。大环境如此,就不要奢求了。

我也打个比方,在荒漠中,你就不要奢求甘雨,如果真的下了场雨,那么你应该感激涕零,而不是当作理所当然。
AWater2010-12-24, 11:15这年头,找本能看的书也不容易啊
菠萝2010-12-24, 16:28还是看Apple的在线文档最好.
有明显错误, 楼主真金白银买了书还不能批评一下作者?
我觉得应该狠批那些滥竽充数的作者, 这样对出版环境才有好处.
菠萝2010-12-24, 16:32麻烦你认清现实好不,国内的环境出不了精品的。他害你什么了?只要没有偏离当前的水准过多,那就没有问题。大环境如此,就不要奢求了。

我也打个比方,在荒漠中,你就不要奢求甘雨,如果真的下了场雨,那么你应该感激涕零,而不是当作理所当然。

浪费金钱,时间, 精力, 被误导不算损失?

要是下了场"毒雨" , 也应该感激涕零?
pdf8992010-12-26, 00:00个人感觉,看apple的文档,上cocoachina足够了.
bluecrystal2010-12-28, 13:51楼主,你太糊涂了,稍微有经验的人都知道目前国内计算机开发类书籍,应该按照以下原则买:
首先买英文版(影印版)--其次买国外作者,国内靠谱翻译的中文版--再这买国内的几个被大家认可的技术作家的,比如侯捷,老孟,老潘之类的作者,剩下的, 你基本可以不用买;
当然买什么书之前, 最好看看网评;

还有, 一般情况下, 还有一个最好的途径就是学什么就直接看其在线文档, 一般在线文档都写得相当不错。
我当初学python和objc都是直接看的其自带帮助文档, 清晰明了。后来都用了一段时间后, 才看得python in a nutshell 和 Learn Objective-C on mac。

所以, 计算机的母语是英语, 看英文资料才是正确选择。
Copyright ? 2000 - 2011 ClassiClub Forum All Rights Reserved.