昨天写完PIMS那篇文章后,睡觉都差不多4点了,早上八点多起来去参加淘宝的技术嘉年华,后来证明,还是值得的,因为图灵出版社的那位好心的大姐送了我两本书,分别是:《重构与模式》和《深入浅出Ext JS》,本来问她要的是一本关于API设计的书,她说那本书太好了,只有一本,如果下午3点还没牛人领走就给我,结果3点那书果断被某牛拿走,于是我只能捡剩下的了,还有两本,不错啊,哈哈~~
上午就听了iConference中的两个主题,一个是淘宝for iOS的历程,另一个是iOS的内存管理,腾讯那位老兄讲的输入法没怎么听,想跑去ACT那边听百度美女讲移动互联网的体验设计,只可惜,美女吸引力太大,门口都挤满了人,挤不进去就去图灵那边跟那位大姐聊天了。不过话说腾讯的那位兄弟讲完后第一个提问的人提的问题相当猛烈,估计跟腾讯有仇,什么惨无人道、流氓软件啊等词语都用上了,很搞笑,貌似还有人鼓掌的~~
下面贴上iConference中我主要听的两个主题的笔记
1、淘宝iOS
持续集成:hudson
淘宝运营:
JSON驱动:首页布局,JSON编辑器(运营操作)
- 节制,不要无限制地增加形式
- 前瞻,提前考虑一些展示形式的变化
- 终极解决方案:WebView(Webkit)
- 拦截页面内链接,从web跳到程序内
基础库:
无关UI部分
统一数据接口,封装为库,包装调用
淘宝开放平台 —–|
淘宝无线开放平台 |——–>TBSDK
其他系统json数据——|
返回统一数据结构
UI组件:
1、商品信息Cell
2、交易信息Cell
3,商品销售属性选择
专用组件:
用户信用等级,卖家服务图标,阿里旺旺在线状态
通用组件:
渐变按钮,网络图片,图片浏览~
工具类,辅助类
1、偏好设置
2、本地数据
3、硬件环境,软件环境(Retina屏幕需要显示高清图片,根据网络环境决定显示内容)
4、常用的功能点,封装为工具类
对于积累:
- 统一功能需求
- 视觉上进行把握和控制
- 及时整理
- 及时重构
复用
淘宝构架
taobao for iphone | taobao for ipad
————————————————
common controllers module controllers
———————————————-
TBSDK
———————————————-
cocoa touch
用到的框架:
- ASIHttpRequeset
- JSON Framework
- SFHFKeychainUtils
- 还有一个忘了
模块化代码
- 功能模块组织代码
- 低耦合的模块独立为单独项目,使用cross-project reference
- 拆分controller内视图处理和数据处理(MVC)
Universal App
- 尽可能使用iphone代码
- 使用autoresizingMask
- 使用宏判断运行环境
对于复用
经验:
内存管理:
循环引用
Weak Link:
(兼容低版本iOS)
结合NSClassFromString
结合respondsToSelector
判断当前版本是否有这个类,如果没有就过滤
判断当前版本屏幕硬件
Theplant Micheal 提的问题:
密码保存:KeyChain,Session ID代替用户信息
2、iOS的内存管理—–李亮/Holly Lee(上海改变科技有限公司技术总监)
李亮
holly.lee@gmail.com
内容:
- 内存管理概述
- oc内存管理
- application内存管理
- 解决内存问题
1、概述
与OSX基本相同
特殊性
模拟器与设备差别
2、
-(id)autorelease;调用autorelease放入autoreleasepool
NSAutoreleasePool对象
NSAutoreleasePool *pool
真正释放的时机:RunLoop
得到对象所有权:
alloc分配的
显式调用retain
调用了方法名称中 有new copy字样
——必须调用release或者autorelease释放
失去对象所有权
release
调用autorelease
set方法,retain传入对象
-(void) setSomeObj:(id)new
{
[myObj release];
myObj = [new retain];
}
混合了c/c++的代码的内存管理:其基本原则是按照各自原来的方式进行
3、iphone app 内存管理
- 在interface builder中连接好IBOutlet对象必须在ViewController本身释放之前释放,否则会造成内存泄露。
- 避免循环引用:循环引用将会导致对象无法释放
- 在内存紧张时的回调和通知:
- -(void)applicationDidReceiveMemoryWarning:
- (UIApplication *)application
- -(void)didReceiveMemoryWarning;
- UIApplicationDidReceiveMemoryWarningNotification
- 内存紧张时,非当前的ViewController会释放view,下一次回来的时候会重新创建(loadView)或者装入view(viewDidLoad),因此需要考虑当前状态
- 仔细考虑系统本身提供的内存缓存方式:
- 对不需要重复使用的图片使用[UIImage imageWithContentOfFile:]代替[UIImage imageNamed:]
- 实验:iphone 1代,最多大概10M;ipad 1代最多20M
- 减少那些autorelease的对象的数量。能使用alloc+release的地方就用
- 尽可能迟的装入或者创建对象。在View Controller上比较多(会增加一下子的内存量),因此需要尽可能避免在IB中建立一切的做法
解决问题
- 问题:
- 内存泄露
- 重复释放
- Instrument Tool:Leaks(监测内存泄露),Object Allocation(当前内存分配情况,监测内存一段时间内的分配情况)
- NSZombieEnabled(监测重复释放)
- 静态分析器:LLVM/Clang Static Analyzer
- http://clang-analyzer.llvm.org
- scan-build xcodebuild
内存释放,有个地方一直没有明白。直接链接IB的那些对象,不写property retian等getter,setter等方法,是否需要释放他们。按照原则来说,我没有在本身view controller里面创建他们,所以不应该负责他们的释放。 问题是,一般我释放了也不会挂。
我对IB映像不好,感觉以前java写习惯了,现在直接用IB,感觉不透明,都不知道他偷偷的干了什么