您的位置:首页 > 其它

iPhone基础概念:斯坦福教程第一讲笔记

2010-01-26 10:41 489 查看
作者 lolfriend

原帖地址 http://www.cocoachina.com/bbs/read.php?tid-5788-fpage-42.html

看斯坦福的iPhone视频有一段时间了,所以做点笔记提醒自己,也可以和大家一块儿讨论学习。
第一讲主要内容是 ObjC基本语法,语法其实很简单,三天就能适应。但是ObjC有很多理念非常重要,需要花时间编程实践才能理解。尤其我又不是学 ComputerScience的,java完全没看过,凭借仅有的C语言基础还是出现了很多理解问题。以下是我个人觉得非常重要或者是花了长时间才弄明 白的概念。下载视频教程及课件网址:http://www.stanford.edu/class/cs193p/cgi-bin/index.php

一、Inheritance:继承

和C++不同,Obj-C只有一个父类,并且只有一个超级父类NSObject(ObjC中所有的类都继承自NSObject)。
问 题来了,如果我新建一个类person.h,但又希望它能继承多个类如appearance.h,behavior.h,thought.h的方法怎么 办?我们可以这样,让person.h继承自appearance.h,而使用behavior.h,thought.h的delegat(委托)。当然 在behavior.h,thought.h中需要通过@protocol设置delegate,并在@optional中声明 delegate可用的方法。这样person.h就可以修改apperance.h中的所有方法,也可以修改在 bahavior.h,thought.h的@optional中声明的方法了。委托的使用方式在UITableViewController中非常常 见。

二、Object Creation:对象创建(create=alloc+init)

All objects are allocated out of the heap;No stack based objects. 说实在的,视频看到这里的时候我懵了好长时间,现在也没完全搞明白,可能有一点点java基础会很容易,可惜偶没有啊。
按我个人的理解是这样的:C++一般采用stack-basedobject,所以用C++编程时,在一个函数中我们可以直接对一个类进行实例化如 Person *aperson,然后就可以调用该对象的函数、公有成员变量,这是因为在执行Person *aperson这条代码时系统在堆栈当中给 aperson腾出了一个固定的空间,所以可以直接使用这个对象。但是同样的代码在objC中就不行,Person *aperson似乎什么事情也没做,只是声明有aperson这么个实例对象,内存没有为它分配空间,所以什么方法都不能执行,我们必须采用 alloc+init才算真正创建aperson 实例对象,然后才能调用它的方法。

三、Autorelease Pool:自动释放池

autorelease pool是个好东西,很多人都知道它的优点在哪里,也有很多介绍它的文章。与autorelease这个方法联用简直就是无敌!不过我想从另一个角度说这 个概念,它与上面讲的object creation有什么关系?(不懂java的人就是会想很多,呵呵)
二中提到:objects are allocated out of heap,但是毕竟所有的数据、对象最终都需要分配到内存空间然后才能被程序调用啊。注意:对象内存分配虽然不在heap或者stack当中,但当对象被 创建好了以后会被自动的放入autorelease pool中,而autorelease pool,以我浅薄的知识理解,其实就是一个heap(不知道说得对不对,请大家指正)。
另外想更多了解heap-based object和stack-based object,可以到该网址看看: http://blog.chinaunix.net/u/18418/showart_307250.html。 该文大概意思是这样的,heap和stack都是在内存中开辟一块儿区域给对象使用,不同的是如果用stack保存数据,那么compiler必须知道数 据长度,因为它分配的空间是固定长度的,而heap相当于一个池,可以把数据、对象一股脑都放进去,而不需要知道其具体长度,所以为操作提供灵活性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: