个人吐糟,不喜勿喷!!!--------------------------------------------------------------
不推荐购买该书中文版,作为纯粹的工具书来说,它已经过时了。
作为启蒙教材来说,书上面到处都是错误,你没看错,就是错误。容易误导初学者。
作为进阶教程来说,它里面没有任何进阶的东西,当然如果你想来个xcode几日游,可以买来看看。
总之,到网上下个英文电子版就差不多了,不值得花这80+来块钱,虽然就是吃餐饭的钱。
----------------------------------------------------------------------------------------
照样写在开头。网上的各种书籍眼花缭乱,各位大神的推荐也是五花八门,有一个迷恋算法追求完美做ios应用的资深果粉(Y)给我推荐了这本书,TA是个很奇特的人,各种婆妈各种啰嗦,但是给我讲起算法还是非常通俗易懂,很快就勾起我对大学里面薄弱的专业知识的回忆并加深了理解。关于ios开发,也听TA唠叨了一些,不过这家伙总是会不小心遗忘我是刚刚才开始学习的菜鸟,于是乎,我只能淡定地无视TA的各种唠叨说教加嘲笑。
好吧,TA说这本书好评很多也很简单等等。说白了,就是很适合初学者过一遍。好吧,具体怎样我也不知道,不过我还是很感谢这个婆妈的人。不过我偶尔会小小怀疑,我会学这个就是因为去年跟TA合作某个项目时被TA荼毒和感染的。
我要吐糟:请问翻译者,您是把原书丢到google翻译里面直接翻译出来的吗?唉,多好的书啊,不能给翻糟蹋了啊。真是让我又爱又恨啊。
-----------------------------------------------------------------------------------
建项目中会遇到的问题:
如果非得按照书中完全一样的走,那肯定是走不通的,书是按iphone4来的,现在iphone5S都要出来了,而Xcode的版本也不一样了。
譬如,想创建单视图项目,现在对象的项目类型是:single view application。而默认生成的项目文件也没有书中所说的两个xib文件,除非在创建时,去掉 “use storyboards” 前的勾。对于书中反复提到的手动管理内存,则需要在创建项目时,去掉 “use automatic reference counting”前的勾。还有些零零碎碎的就不写了,啰嗦这么多只是给自己一个提醒“书还是得比对着看”,只看一本两本容易被误导。
interface builder快捷键:
按住commond键,鼠标移动到button左上角/右下角,拖动鼠标,控件几何中心不变,大小按比例缩放。
杂七杂八的英文单词:(待补充)
-----------------------------------------------------------------------------------
【iphone篇章】
1、Simulator(模拟器)的限制(ipad与之相同)
在我完全不认识xcode的时候,就已经熟悉了ipad模拟器,不过当时都是Y手把手帮我把一切都搞定包括phonegap框架的搭建之后,我直接进行web应用开发。不啰嗦了,菜鸟就应该有菜鸟的姿态。
- 不支持重力感应、摇动和旋转、多指触控(这些对于游戏开发可能比较纠结)
- cpu和内存的使用表现与真机有区别(这个我深有体会)
- 其他如摄像机、GPS、邮件发送等都无法在模拟器上实现
所以,难怪别人说做ios开发硬件成本高,好吧,我现在就缺个iphone了。不过我还是不后悔去年选择了note2而不是iphone5,^_^。。。攒钱中。
2、ios开发中两种常规委托模式:MVC和VC
MVC:模型-视图-视图控制器
VC:视图-视图控制器
3、IBOutlets 和 IBActions
IB:interface builder的缩写
IBOutlets:对UI对象的引用,代码通过IBouterlet对UI进行修改,如,设置文本框的内容、改变颜色等。
IBActions:绑定到事件上的方法,当事件被触发时响应
4、nib与xib
xib是nib的二进制编码文件。不过,在最新的xcode中,创建项目时,如果用默认的选项,将不会生成xib文件。
MainWindow.xib :根视图。在最新Xcode中,已经不存在这个xib文件。(待研究)
关于该根视图的声明周期问题,见P54-P55,mark!
5、文件所有者(不太理解这个奇怪的概念,待查证原文,总感觉翻译的怪怪的,mark)
6、help》Xcode help,帮助手册简单介绍
前缀:c:类(class);pr:protocol(协议)
以UIPickerView 类为例,该空间的文件所有者需要实现的协议有 UIPickerViewDataSource 和 UIPickerViewDelegate
7、应用程序设计法则 - IOS HIG 和 iphone应用程序分类
http://developer.apple.com/ios
HIG将应用程序分为三种主要类型(常用于iphone的开发):
- 引人入胜的应用程序
特点:如游戏等,会有非常个性化的界面,使用户与设备间达成互动。HIG不再显得那么重要。要求这个控件提供一个内部一致的体验。 - 效率应用程序
特点:帮助管理信息和完成任务。信息是分层的,通过向下延展,进一步细分信息级别。在这一类程序中,由于我们会使用标准控件,每个控件都必须完全符合HIG的各种规则。如,新闻阅读器,食品列表展。 - 实用应用程序
特点:获取特定信息给用户,通常比效率程序拥有更多的界面设计,并预期能够与HIG相一致。可能没有任何实际数据工作。如,秒表工具。
上述分类为对书中内容的总结归纳,正确性和准确性有待进一步考证,等这本书结束后会去看HIG的。到时候会回头扩充和修改。吐槽下,这本书翻译者的中文语法真让我感到汗颜,各种不通顺啊,唉,还好里面有大量的图解和代码,文字不多。否则我真要崩溃了。不过鉴于自己英语弱而时间紧急,还是很感谢翻译者的。
8、关于tableView的使用说明
书上提到的给addButton添加action的方法已经过时,因为ios自动生成的MasterView中,已经内置了该按钮,并绑定了对应的方法到该按钮上。
下面是主视图.m文件中的两端代码:(我感谢这本书,教会了我如何调试ios程序。。。)
- (void)viewDidLoad
{
[super viewDidLoad];
// new code
NSString *path = [[NSBundle mainBundle] pathForResource:@"DrinkDirections" ofType:@"plist"];
_drinks = [[NSMutableArray alloc] initWithContentsOfFile:path];
// Do any additional setup after loading the view, typically from a nib.
self.navigationItem.leftBarButtonItem = self.editButtonItem;
// 此处即使按钮的声明,注意,其中的 insertNewObject 就是点击addButton之后执行的方法
UIBarButtonItem *addButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)] autorelease];
self.navigationItem.rightBarButtonItem = addButton;
}
// 主视图.m文件中的insertNewObject。被注释掉的是默认生成的代码,后面的打印是我的测试代码
- (void)insertNewObject:(id)sender
{
// NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
// NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
// NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
//
// // If appropriate, configure the new managed object.
// // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template.
// [newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];
//
// // Save the context.
// NSError *error = nil;
// if (![context save:&error]) {
// // Replace this implementation with code to handle the error appropriately.
// // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
// NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
// abort();
// }
NSLog(@"insertNewObject");
}
9、模式视图是个什么东东?mark
P236提到,通过添加一个模式视图来吸引用户的注意力,该视图会从底部向上滑入,该视图可以在不需要时关闭。该视图不会被push到视图的堆栈中。即,用户不会通过返回按钮回到该视图。
10、Undefined symbols for architecture i386:错误解析
Undefined symbols for architecture i386:这种错误一般是你用模拟器作为目标,但编译的时候找不到相关的库文件,需要做的就是把库文件所在的位置添加到library search path中。其它原因可参考下面网址:http://stackoverflow.com/questions/6984368/undefined-symbols-for-architecture-i386-objc-class-skpsmtpmessage-refere 还有另外一个:http://stackoverflow.com/questions/6610709/undefined-symbols-for-architecture-i386
说明:上面的答案是在网上搜的,后面的地址还没时间去仔细研究不过经检查,就是我在import文件时,不小心引用了一个被删掉的.h头文件。唉,拼写错误害死人。没想到,我又被自己坑了。
11、把已经生成的UI组件装进 UIScollView
选中所有UI控件,使之高亮显示,在选择(顶部)文件面板中“Editor>Embed in>Scroll View”,即可将制定ui控件快速包装到 UIScollView 中。
12、@property (nonatomic, retain) NSMutableArray *drinkArray;
关于引用计数的问题,默认不增加引用计数。如果不加retain,会出错,如下详细描述。
下面是在主视图控制器中,插入一个新的模式视图,插入时,会为模式视图中的drinkArray添加到主视图drinks的引用。(唉,好难说清楚,の,只求自己明白吧,记住了!!!)
- (void)insertNewObject:(id)sender
{
MSCAddDrinkViewController *addDrinkViewController = [[MSCAddDrinkViewController alloc] initWithNibName:@"MSCDetailViewController" bundle:nil];
// 如果此处的引用为弱(默认)引用,则模式视图执行【_drinkArray release】时将导致self.drinks指向的内存被释放;如果再次开启模式视图,并执行【_drinkArray release】,将会出错,因为此时指向的内存地址已经被释放过了:
addDrinkViewController.drinkArray = self.drinks;
// NSLog(@"%@",addDrinkViewController.drinkArray);
[self presentViewController:addDrinkViewController animated:YES completion:nil];
[addDrinkViewController release];
}
13、视图各种状态(被remove掉的 viewDidunload)
书上把取消后台注册的代码放在viewDidunload中,但是在ios6+中,这个方法已经被移除掉了,我想了想,把这块的代码放在了viewWillDisappear中。
根据书上的说法(298p),の,翻译很烂不过我想起码原意不会错吧,第四段问答最后一段。提到,viewWillDisappear(主视图中的)会在显示详细信息(即显示新视图)之前被立即调用,所以当我们在新增加的列表的详情页,直接点击home键退出时,将导致新增的数据丢失。好吧,编译之后正常运行,没有什么异常。so,书上的说法值得商榷。
viewDidLoad(手动管理内存时会用到,主要用来释放和清空视图)
viewDidUnload(已经被移除)
viewWillAppear(即将进入)
viewDidAppear(完全进入)
viewWillDisappear(即将离开)
viewDidDisappear(完全离开)
14、关于程序进入后台的问题
在写JS的时候,完全不用考虑这个问题,因为浏览器即使在后台运行,页面中存在的定时器等也会持续跑,所以,w3c才会引进页面状态这个属性(纯属个人猜测,哈哈)。即使是做web富应用开发,一般要在乎的可能只是DOM元素与用户的交互状态,或者根据交互加载等状态来判断是否与服务器进行数据请求等等,基本上不存在“应用进入后台”的概念。(至于以后会不会出现,我不知道)说白了,就是,不care硬件和系统,完全100%依赖浏览器!!!!!!
经过几番探索和请教,我大致明白,程序进入后台是个什么概念。对IOS应用来说,进入后台之后应用将不再运行,但是可以为“程序进入后台”这一事件---添加事件监听器(好吧,这是JS的术语)。这样,当“程序进入后台”后,会执行指定的方法。譬如,开发一个音乐播放或者有下载功能的应用,就会用到。
唉,说的不清不楚,汗颜!
15、关于iphone和ipad的一些基础知识
iphone4+:使用retina屏幕,分辨率为640*960,对角线尺寸为3.5英寸。
ipad:屏幕分辨率是1024*768,ipad2+为高精度,精度为2048*1536
------------------------------------------------------------------------------------
【ipad篇章】