前言
早就盼望着这一天发布博客记录我写程序的路程!
是的,是第一个写在csdn上的app制作笔记!终于完成这个程序!!
虽然有bug且功能单一,作为一个练手的app做出还是很有成就感,故拿出来和同样的新手朋友们一起分享~
感谢kangkangz4博主写的的客户端模型,我才有了样例去remade,去学习怎样做一个好玩的团购客户端 :)
历时6天,终于基本做出了我想要的功能,也基本美化了一番~
期间还有过通宵做的时候,不得不说,一旦去按照自己的想法去做想要做的事的时候,
再苦再累也有激情!
当然跳了不少的坑,但是这6天也学习了不少的东西!
是的,真不少,生活作息也绝对不规律,但是当今天app成型的时候发现,一切都值了!
第零篇主要是写跳过的一些坑的爬坑过程和一些思考学习点,但是做程序真正遇到的坑真的不止这些,
也是当app做了一半的时候才想起来做些笔记,让我通过写app制作过程的后续中慢慢介绍。
原作 iPhone团购信息客户端
作者 kangkangz4
blog 地址:http://blog.csdn.net/kangx6/article/details/7714140
一些说明
过程并不顺利,因为作者做的程序比较早,
所用的 美团api地址也已经失效,本来想用美团新的api好像要注册什么的有些麻烦,
正好看到 百度糯米的api 可以直接生成地址,于是就用了百度糯米的api。
基本上是我自己重构的代码,本来写在一个文件里了,然后重新分层做接口做的欲生欲死,
所以最后拆出两个接口就不打算再拆了,时间耗费的有些长,比开始就用mvc架构来写要恶心多了!
好吧,进入正题。
With source code
这里提供我的程序源码:糯米团
爬坑与思考(日记)
做完程序回过头来看看……
AQGridView对象的delegate设置过了(_gridView.delegate = self),并没有执行delegate实现的方法。
Solution:没有执行[_gridView reloadView]
被空指针坑的不轻,编译器并不会报错,只是程序执行没有效果而已。
关于图片缓存,用了什么机制?
My thinking: 看上去好像用了NSMutableDictionary对象来缓存数据, 通过查看关于 IOS开发缓存 的blog发现可以用NSURLCache类来执行, 这样看来是ASIHttpRequest框架给自动封装好了缓存机制,请求过后得到的数据相同, 就可以直接载入dictionary了,也就实现了图片缓存。
是怎样根据往下滑动,数据不断加载的?比如图片的加载。
和自带的一样, cellForItemAtIndex 这个方法的调用就会发现通过不断return cell, 才会执行图片的加载方法的,才会不断显示图片。
又一个坑,把图片定义到表格上,我们知道表格是第几个,因为有这个方法带有index(indexPath),那么怎么知道表格上的图片是第几个,怎样执行相应的方法?
好吧,果然通过stackOverFlow了解了到底为什么- (IBAction)button: 后面为什么总要跟着一个(id)sender, 原来sender传送的,不就是button自己本身嘛! 在程序中用英文注解的,并附上stackOverFlow原帖网址。
要知道封装起来多么的恶心!我是把代码写在一个文件里,然后在那拆,设置接口、真>是日了狗……不说了,锻炼去了,回来继续拆,但愿今天工程能够完工。
用performSelector解决,具体看程序。 这里有两个关于selector传值的答案:
http://stackoverflow.com/questions/16842151/how-to-pass-parameters-using-selector
(上一个selector传参用)和(下一个基本是程序中我遇到到问题)
http://stackoverflow.com/questions/4011297/passing-parameters-to-the-method-called-by-a-nstimer
我承认第二个答案也不是我想要的,但是看他解决的问题和错信息提示:
‘NSInvalidArgumentException’, reason: ‘* -[MapKitDisplayViewController updateBusLocation]: unrecognized selector sent to instance 0x4623600’
这种看起来就是传值乱传了个呗,那我只要把传递的参数类型判断一下就好了, 假如随便乱传了东西,那么方法里就直接给nil就解决了我的问题。
多线程调用,刚开始我模拟网络读取“南京”的api时用的是xml文档,因为本地解析文档太快所以直接写了nstimer来延迟加载,这样就有了给MBProcessorHUD加载提示框显示的时间,但是nstimer计时时占用了主线程,所以计时器在运行时就不能进行其它操作。
所以要把NSTimer对象放到别的线程去执行~这真的是一个学习的过程、、现在看的我很痛苦,但还是要看下去。
http://www.cnblogs.com/wwwkhd/archive/2011/09/14/2176018.html
http://www.oschina.net/question/54100_36134不就创建一个timer的线程执行嘛!真的有那么简单?
四、NSTimer为什么要添>加到RunLoop中才会有作用
iOS并发编程(Concurrency Programming)系列之一:Run Loop所以并不是没看到main thread没有添加runloop就是没有添加,放到新线程里还是得手动添加。
2015.12.13 把timer放到别的线程里的想法已经落空,或许你早就想到了,doesn’t make sense! 是的,虽然占用的是主线程,把它放到别的线程执行的意义又是什么呢?于是写了一个performSelectorOnMainThread的方法,但是好像并没有什么作用,或许我不该self引用>,不过现在已经不想折腾了,折腾了这么久线程内存都看了七里八里的了,反正也就1秒的>加载时间,随它去吧……
看到上一个runloop的操作中有autoReleasePool,就不得不把ARC联系到一起,是的,IOS用strong代替了retain,用weak代替了assign,arc机制也是自动内存回收的机制,那么手动的autoReleasePool块也就不行了,但是依然可以采用@autoreleasepool的方式延迟内存>的释放。
http://segmentfault.com/q/1010000000520778
复制一下别人说的:你写到了release/retain等方法, ARC 下你不能写这些方法,但ARC 会帮你在合适的地方>插入这些方法。这将导致内存的延迟释放。
所以引出一个疑问(actually the question in my mind remaining too long, now I’m giving it an answer!):所以说为什么有了ARC还是用手动来释放内存?
网上有人是这么说的:效率比较低。
http://blog.csdn.net/h3c4lenovo/article/details/8423644
所以具体怎么dealloc?
http://www.cnblogs.com/kenshincui/p/3870325.html
说到这还有一个也是脑海里存在已久的疑问,明天拿出来一块解决!--多线程对比。NSThread、NSOperation、NSOperationQueue、GCD
http://ju.outofmemory.cn/entry/136672
http://www.cnblogs.com/wisdom-yao/p/4226882.html啊,看了看简直太烦了,看来要写NSThread还要加上autoreleasepool进行释放操作, 而且并没有用过NSOperation和NSOperationQueue方法, 更别说GCD,这次还是使用NSThread吧, 毕竟想今天完工!
但是说起来GCD是基于C语言的框架却是苹果推荐的多线程技术。
GCD深入理解 http://www.cocoachina.com/cms/wap.php?action=article&id=8248关于ARC的内存管理问题,一些东西并不会自释放从而导致内存泄漏,比如NSTimer,还有一些扩展的属性怎么释放到底是怎样的还有待研究,未完待续。