Objective-C的入门学习笔记
对于一门语言得学习,个人觉得最主要得就是其语法格式和那些关键字。
因为对于基本现在大多数得语言,每种语言都是一种符合人思维得方式来与计算机交流。
因此,其实每种语言中定义或是封装好得基础类和类库,其实都是很相似得。
比如 int,double几种基本类型,string,数组,集合以及字典数据类型。
因此你在编程时比如你想以字符串形式和计算机交流,那你很容易就能想到在c中可以使用string这个类,在java中也是stirng
(当然,前提是你至少有一种同抽象级别得语言基础),那oc呢,也有这样一个类吧,不过是某种原因加了个前缀。
那么对于类中定义函数得使用,可能不同语言就有所不同了,首先是函数名(这个其实基本不担心,现在得ide工具提示太强悍了,真不行你可以文档),
其次就是函数得调用格式,我这简单理解为语法格式得一种。
一、语法概览
1.首先一个类的组成
这个知道c的基本没什么说的 .h和.m文件。一个是头文件,一个是实体文件。
oc中一般说是申明文件和实现文件
简单来说,h文件就是整体对一个类得描述,m文件是对h文件中申明描述得实现
//
// nonoappdelegate.h
// multiviews
//
// created by nono on 12-4-19.
// copyright (c) 2012年 nonowithlilith. all rights reserved.
//
#import <uikit/uikit.h>
@interface nonoappdelegate : uiresponder <uiapplicationdelegate,uitabbarcontrollerdelegate>
{
uitabbarcontroller *tabbarcontroller;
uiwindow *window;
}
@property (retain, nonatomic)iboutlet uiwindow *window;
@property (retain, nonatomic)iboutlet uitabbarcontroller *tabbarcontroller;
@end
2.来看头文件得格式和申明
#import这个关键字没啥说的,java中叫导入。就是引入你当前类所要用到得依赖库和类。
@interface 申明开头关键字。 后面紧跟的是定义额类名 :后面的是继承得类 uiresponder ,< xxxxxxxxx>有点类似于java中得接口,当然 oc中有个
更加准确得定义就叫协议 ,<>放协议类。 整个申明最后都以@end结束。
{ }里面就是常说得申明成员变量。
@property 属性,我暂时理解为也有点成员变量的意思。 这个属性更多是和后面得m文件中的的synthesize关键字有密切联系。
(retain ,nonatomic)属性的一些参数。这个具体可以去看文档,估计c语言额同学应该不陌生,我不是很明确每个参数比较适合得场合。
iboutlet 关键字,这个是和nib文件息息相关得,只要在nib文件中需要关联的对象,用这个修饰(比如我nib文件中有个window控件,要和代码中这个对象联系起来
,那么就用这个关键字申明),申明完后会看到这段代码最左端有个空心圆圈,当你和nib文件中控件关联后,就实心圆圈了。
//
// nonoappdelegate.m
// multiviews
//
// created by nono on 12-4-19.
// copyright (c) 2012年 nonowithlilith. all rights reserved.
//
#import "nonoappdelegate.h"
@implementation nonoappdelegate
@synthesize window;
@synthesize tabbarcontroller;
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions
{
// self.window = [[uiwindow alloc] initwithframe:[[uiscreen mainscreen] bounds]];
// override point for customization after application launch.
// self.window.backgroundcolor = [uicolor whitecolor];
self.window.rootviewcontroller = self.tabbarcontroller;
[self.window makekeyandvisible];
return yes;
}
@end
3.实现文件
implmentationxxx @end。这个不用说了吧。
@synthesize 这个关键字有点意思。这个关键字得表示法后,编译器就自动隐式生成一个setter和getter,oc上得说法来说就是自动实现一个
存取方式。然后我们知道,oc语言这个习惯方式,一个方法和属性在使用前都必须有个申明,就是 h和m文件这个构造啦。那对于h头文件中property
我们是不是可以理解,这是对编译器得一个申明,我将在实现文件中实现这个对象得存取方法,而在m实现时只不过我们一个关键字后让编译器去做了这个事。
4.例子最后说下oc中对象得方法得调用
比如在java中我要调用 a对象的functiona()方法,直接用得点表示法 a.functiona();
在oc中有点奇特表示成 [a functiona],如果方法呀传参数,那么紧跟着 functiona :obj
二、关键字
1.ns前缀。oc得大部分类都有这个前缀。要理解缘由,可以去看oc得历史。
2.bool 这个数据类型有点改动,在常见得语言中都是true和false,oc是yes和no。
3.@protocol关键字,这个是申明协议类时,和@end连用,看字面意识就知道了。
对于协议我们上面提到,有点类似于java中得接口,当众所周知,接口中申明得方法必须全部实现。java中当然对这样一个强自行手段有引申出
抽象abstract这个类来对这种强制手段一个缓和,oc中则直接在协议类中申明了这一点,对于有些方法不需要强制实现,可选得,用了optional。
这个你可以具体随意跳入哟个协议类看就好了,相信在以后更多代码接触后会有个更深得理解。
4.对于刚接触oc语言得人可能有个小疑惑得类型 (id),这个可以理解为java语言中得泛型。
三、oop思想
面向对象这个概念性东西大家应该都有。
什么继承,封装,多态这些就跟背单词一样。但是,简单的还是需要用大白话能说出来的。
先说封装:封装我觉得其实是oop思想最原始的一个基础。封装的引入后,才能衍生出对象这一概念。我们把一个物体和它拥有的属性和更能包装起来,是一个抽离然后融合的过程。
继承:继承从字面句很好了解,儿子继承父亲。一个物体派生出一个新的物体。当然,继承后的很多特性,你可以背书去。
多态:多态其实更好解释了,听字面,多种形态?一个事物的多种实现(当然,这个可能很直观很字面,但是从严谨性上来说是错误的)因为一个物体的多种实现,怎么
看怎么听都是像继承啊,比如我有个鱼类,那么我可以派生一个鲨鱼类和一个鲸鱼类,那对于这个做法来说,感觉是继承啊。其实他们的本质思想都是差不多的,
只是侧重点的不同。继承更像表达一个物体派生一个新物体,多态则是一个物体派生出多个物体对改物体的不同实现,这个实现最直接的方式就是对超类中方法的不同的覆写和实现。比如鱼类,有个eat()方法,派生的鲨鱼类,我们都知道鲨鱼吃肉,那么我们可以实现鲨鱼的eat方法是吃肉的,蓝鲸我们算他杂食吧,那么蓝鲸的eat方法则是实现杂食吃法。此时你就可以站在一个全面的角度简单的看到多态这个概念了。
对于深入理解oop这个思想定义,其实就类似于看你对待事物抽象的高度。
四、新事物的或者说一个新类产生的集中方式
1.最原始得一种,就是我们自己抽象定义除一个类。比如定义最原始的类,在java和oc中都存在这样一个原始类object。
2.继承而来派生出一个新类。这个很好理解。比如从人类human衍生出男人类 man,
3.还有一种是我们比较少明确意识到,但是其实是很常用到方法:复合,既用几个不同的类来复合成一个新类。最常用就以书上例子解释 ,car 汽车类,
简单我们可以用engine引擎和tires*来构造成最简单的car模型。
五、oc中类别和非正式协议概念
1.category,类别应该算是oc独有的一个术语,书上给类别的定义是:一种为现有类添加新方法的一种方式。
其实这个方式怎么听怎么像创建子类就可以做到的概念。
是的,为一个类做扩展,我们最常想到的方法就是为其创建一个子类,然后添加你需要扩展的新方法等。
但是在oc中有时这样并不方便,书上举例了一个nsstring的例子。原话是这样的:
/**********
当希望为新有类添加新的行为时,我们通常会创建子类。
但是有时子类并不方便。例如,你可能会希望为nsstring类新增一些新行为,但是你知道,nsstring实际上只是一个类簇的前台表示,因而无法
为这样的类创建子类。省略1000字。
********/
好了,从上面我们基本知道,创建子类这个方法是有局限性的对吧。上面引入一个概念叫类簇。
字面意思(一簇鲜花,就是许多朵花扎成一束呈现出来,里面的具体其实我们是不知道的。)
类簇其实也算是个不大不小的概念。集体可以看官方文档 http://www.apple.com.cn/developer/mac/library/documentation/cocoa/conceptual/cocoafundamentals/cocoaobjects/chapter_3_section_9.html
鄙人也是新接触这玩意儿,里面有这么一句话:
/*****
类簇将一些私有的、具体的子类组合在一个公共的、抽象的超类下面。
****/
我不知道是不是可以理解。类簇包含的成分是带有私有性质的,但我们都知道,继承后的子类是不能访问父类的私有成员的(这个应该没错吧?)
那么我们在新创建的子类添加的新方法就无权限访问那些东西咯。
好吧,以上是个人理解,这东西也是听拗口的,具体详情可以参考更多官方文档。
那么,好了,我们大体上知道oc引入类别这个机制的原因了。配合上oc动态运行时的分配机制,你可以为现有类添加新的方法,嘿,这
听起来很酷!(书上原话)
类别创建:
@interface nsstring(numberconvenience)
-(nsnumber *)lengthasnumber;
@end//numberconvenience
声明有两个特点:
(1)现有的类位于@interface关键字之后,其后是位于圆括号中的类别名称。类别名称是numberconvenience,而且该类别将向nsstring类中添加方法。换句话说:“我们向nsstring类中添加一个名称为numberconvenience的类别。”同名类别有唯一性,但是可以添加任意多的不同名类别。
(2)可以执行希望向其添加类别的类以及类别的名称,还可以列出添加的方法
不可以添加新的实例变量,类别生命中没有实例变量部分。
类别的实现基本和一般类的实现一样。
非正式协议和委托:非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。
这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。
这么看,总觉得类别这玩意儿有点像协议的可选协议。
可选协议只不过是有先见之明,类别是后期补救。共同一点时,对于方法实现都是可选的。可选协议有关键optionnal申明了,类别则你像高效方法你就申明,
不想就算了。
之后是委托,算oc中一个很重量级的概念。据说深入后会发现很多东西,主要鄙人目前还只接触几天,对于它在oc中整体的设计模式理论还是不太了解。
只是在写例子代码时,怎么看怎么觉得就如java中的监听和回调。可能要更好的理解,那还是要更多的接触代码才能会有个深刻的理解。
六、内存管理的改变
只所以说内存管理的改变,是以前一直说c和c++成员的在工作中最需要注意的问题就是内存管理。
在接触ios5.1前,网上看了大部分资料,内存管理都有很重要的戏份。
只是,当我学习时,发现,这块被淡化了。
现在版本的新特性引入了arc机制。感觉完全变的和java一样了。
在创建项目选者arc选项后,你会发现在代码中你根本不用手动去释放内存了。release什么都被划掉了 = =。