【IOS】深入浅出iphone/ipad 开发 ...持续更新中

个人吐糟,不喜勿喷!!!--------------------------------------------------------------

不推荐购买该书中文版,作为纯粹的工具书来说,它已经过时了。

作为启蒙教材来说,书上面到处都是错误,你没看错,就是错误。容易误导初学者。

作为进阶教程来说,它里面没有任何进阶的东西,当然如果你想来个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篇章】


转载于:https://my.oschina.net/maomi/blog/143286

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值