[obj-c]类,对象,方法 (二)

关于面相对象于面相过程的区别:
C语言,面向过程性语言。
Objective-C则是,根据C语言所衍生出来的语言,
继承了C语言的特性,是扩展了C的面向对象语言。

面向过程是分析出解决问题所需要步骤,
通常可以当作是需要做什么,然后一步步实现,
使用的时候依次调用。自顶向下的编程。

面向对象是把构成问题事务分解成对象,
建立出对象目的不是为了完成某个步骤,
而是描述出某个事物在解决问题中的行为。

如果对于上面文字比较模煳,可以参考知乎上一个搞笑又内涵的答桉:

面向过程: 吃(狗,屎)
面向对象: 狗.吃(屎)

可以看出,面向过程强调的是『吃』,「狗」跟「屎」只是一个参数;
而面向对象则是,一个『狗』对象,有一个『吃』方法,参数「屎」;

—————————————————————-
一、对象
具有相同或相似性质的对象的抽象就是类。
因此,对象的抽象是类,类的具体化就是对象,
也可以说类的实例是对象。 对象也可以说就是一个物件。

简单来说,假设你有一只『狗』,而『狗』它就是一个对象。
再进一步说,这只『狗』是一直「(独特的)狗」,
那麽这只「(独特的)狗」就是一个实例。
再下来,『犬类』就是类的名称,
这个实例就是从该类创建的。

二、实例和方法
类的独特存在就是一个实例,对于实例执行的操作称之为方法。
还是以『狗』为例,狗的「吃」,「吃」可以作为实例方法。
另一个则是 类方法 。类方法是属于整个类,而不属于某个对象。

假设你有2只『狗』,其中1只执行了「吃」,这个时候「吃」这个方法影响了『狗』的温饱状态。
这也就是说:对象是类的独特表示,每个对象都包含一些通常对该对象来说的私有信息(数据)。方法提供访问和改变这些数据的手段。使用方法可以影响对象的状态。

三、Objective-C 类
下面将直接定义一个实际的类,以至于可以清晰的理解上面那堆字。
「对于不太会文字表达的我来说,其实上面写的好痛苦,感觉在写绕口令一样。」

—————————————————————-
相关项目,里面附带文字注解,以便理解
点击右侧进行下载_>:testProduct_2

1、在昨天项目中进行,新增1个类,Dog。
在项目目录点右键——New File… 或者使用快捷键【command + N】
QQ20140307-1

2、选择 objective-c 类
QQ20140307-2

3、设置类名,于继承父类【NSObject】
QQ20140307-3

关于.h和.m文件说明: .h为头文件,.m为Objective-C源文件
附带点其他的:
.c 学过C语言的同学都知道是C语言源文件
.cc \ .cpp 则是C++语言源文件
.mm 这里是适用于溷编,Objective-C++ 源文件
.pl perl 源文件
.o Object编译后文件

打开 Dog.h 关于

[objc] @interface Dog : NSObject [/objc]

_>此处 Dog 为 类名,建议类名以大写字母开头,方便其他人阅读你的代码
_>此处 NSObject 为 父类,这涉及到继承,后面会详细说明

打开 Dog.m ,将在@implementation Dog加入括号,并创建一个变量

[objc]
@implementation Dog{

NSString * foodStr;//名字
}
[/objc]

_>此处前面NSString 为变量类型,字符串,
_>此处foodStr,则是变量名。

关于变量名,命名规则:
1.字母和下划线_开头
2.之后可以任意大小写字母,下划线,数字组合。[注意OC有区分大小写]
【注意】: 编译器有保留字不可以用。如:int「一般为紫色字体」

4、下面将写一个类方法,打开Dog.h,加入以下代码:

[objc]
@interface Dog : NSObject

+ (NSString*) getObjectName;//加入代码
[/objc]

解释下这个方法。
_>首先方法开头的 + 加号,表示的是类方法。
类方法前面说过了,他不需要实例化,但他也不能访问实例变量。
_>接着括号内NSString,表示方法返回类型
_>getObjectName,表示方法名
_>最后 ; 分号 结尾

打开Dog.m,加入以下代码:

[objc]
+ (NSString*) getObjectName{

return @"Dog";//返回值,此处是NSString类型
}
[/objc]

打开main.m,加入以下代码:

[objc]
//输出 类方法 的返回值,这里可以看到类方法是不需要实例化。
NSLog(@"%@",[Dog getObjectName]);
[/objc]

这里来说下[Dog getObjectName],
_>括号左边一般是跟着类名或者类实例名称,这里的DOG,是类名
_>之后用一空格隔开,加入要执行方法,这里方法名是getObjectName
【注意】类方法不可以对成员变量进行存储,因为各成员变量均存放在具体对象所对应的内存中。
控制台输出如下:

[objc]
2014-03-10 09:46:18.803 testProduct[1094:303] Dog
[/objc]

5、实例方法,打开Dog.h,加入以下代码:

[objc]
/** 获取食物 */
– (void) getFood;

/** 设置食物 */
– (void) setFood : (NSString*) food;
[/objc]

_>开头的不同在于 – 减号,表示的是实力方法
_>void 表示不返回值
_>getFood 方法名

_>setFood方法后面带了 ‘:’,这是表示要插入参数,紧跟在 : 后面则是需要添加参数
_>(NSString*) food ,其中NSString 表示参数food的类型;

在这里稍微整理下,如何声明一个方法:
方法类型 (返回类型) 方法名 : (参数类型) 参数名;
如:- (void) setFood : (NSString*) food;
【方法类型】+ 为类方法 , – 为实例方法;可见上面是 实例方法;
【返回类型】void,则是不返回值
【方法名】 setFood
【参数类型】 NSString
【参数名】 food

如何声明带2个参数的方法:
方法类型 (返回类型) 方法名 : (参数类型一) 参数名一 : (参数类型二)参数名2;
如:- (void) setFood : (NSString*) food : (NSString*) food2;
【方法类型】+ 为类方法 , – 为实例方法;可见上面是 实例方法;
【返回类型】void,则是不返回值
【方法名】 setFood
【参数类型一】 NSString
【参数名一】 food
【参数类型二】 NSString
【参数名二】 food2
当然这样写是可以的,不过推荐最好是酱紫写:
方法类型 (返回类型) 方法名 : (参数类型一) 参数名一 参数名2描述 : (参数类型二)参数名2;
如:- (void) setFood : (NSString*) food andFood : (NSString*) food2;
【参数名2描述】andFood

回去继续写完这个2个实例方法。
打开Dog.m,加入以下代码:

[objc]
– (void) getFood{

//通常检索实例变量值的方法叫做取值方法[getter]
NSLog(@"%@",foodStr);//打印出之前设置值

}

– (void) setFood : (NSString*) food{

//通常设置实例变量值的方法称为设值方法[setter]
foodStr = food;//设置值

}
[/objc]

_>这里说下 = ,不是叫做等于号,是赋值的意思。
例如上面的,是food 赋值给 foodStr ,
而 等于号则是 == ,后面会在算数表达式上说的。

打开main.m,加入以下代码:

[objc]
// a 对象
Dog *a;
a = [Dog alloc];
a = [a init];

// b 对象
Dog *b = [[Dog alloc] init];

// c 对象
Dog *c = [Dog new];

//设置 food 参数
[a setFood:@"苹果"];
[b setFood:@"香蕉"];
[c setFood:@"梨子"];

//打印 food 参数
[a getFood];
[b getFood];
[c getFood];

[/objc]

先来看下 a 对象:
_>Dog *a; 意思则是:a是一个Dog类型的对象;关于 * 星号,表明对象的引用(指针)
此时 a 并没有存储数据,而是存储了一个内存地址,可以认为他是个盒子。
_>a = [Dog alloc]; 这里的alloc,则是分配新内存存储空间;
此时内存中会保留足够空间用于存储对象数据,包括实例变量的空间。
_>a = [a init]; 这里的init,用于初始化类的实例变量;
【注意】alloc 是分配新内存空间,其实真正对象始终没有被正确的初始化,所以需要init初始化对象。

接着看下 b 对象:
要说a对象和b对象写法上有点不一样,貌似是的,但又没啥不一样。
在一般情况,会用把alloc和init直接合并到声明行,进行简写,而简写后则是b对象那样。

最后看下 c 对象:
这里用的是new的方法,它可以将alloc和init的操作结合起来,
但是大部分情况下,貌似大家都比较偏向写[[类名 alloc] init];

回顾前面[Dog getObjectName],同样
_>上面说过了,括号左边一般是跟着类名或者类实例名称,同样这里的则是实例名称,如:a b c
_>之后用一空格隔开,加入要执行方法,这里方法名是 setFood:参数
再回顾之前的2参数情况:
如:- (void) setFood : (NSString*) food : (NSString*) food2;
则在调用方法如下 [a setFood:@”苹果” :@”香蕉”];
如:- (void) setFood : (NSString*) food andFood : (NSString*) food2;
则在调用方法如下 [a setFood:@”苹果” andFood:@”香蕉”];

好了,现在输出控制台,这一章就可以结束了。

[objc]
2014-03-10 09:46:18.803 testProduct[1094:303] 苹果
2014-03-10 09:46:18.804 testProduct[1094:303] 香蕉
2014-03-10 09:46:18.804 testProduct[1094:303] 梨子
[/objc]

由于以前一直没有写过这种类似教程的整理帖,
难免会让大家看着难受,或者看着看着不知所云。
就简单拿这章吧,写的时候很怕写错或者写漏什么,
所以从星期五写到这个星期一,汗颜呀。

75 thoughts on “[obj-c]类,对象,方法 (二)

Yhkhwg进行回复 取消回复

电子邮件地址不会被公开。