1、类和对象的定义
类,根据汉语意思,我们就知道它表示具有共同特征或者属性的物的一个概括,我们也经常称为种类。在OC同样具有或者说继承了上面的意思。在OC中,我们能看见的、能摸得着的都可以建一个类。类也是我们接下来要说的-对象要创建的前提。 对象,就是我们类的现实个体,即在程序中的表现为,我们能从屏幕上所看的东西。OC中面向对象即直接面对我们的要想移动或者操作的目标,而不是过程化的思维。
2、类和对象的创立
要完整的创立一个类,那么我们必须有有我们这个类的声明和定义(即实现)。在OC中采用@interface 来声明。例如,声明一个狗这个类。
@interface Dog :NSObject // 狗的成员变量:体重、毛色、吃,跑
{ @public
double weight;
Color curcolor;
}
- (void)eat;
- (void)run;
@end
为了描述我们这个类的一些属性或者说公共特征。我们就定义了一些变量,例如上图的“double weight;”,我们称这些变量为成员变量。为了实现类对象的一些行为,我们也需要在类声明中声明一些可以操作对象的行为的函数,例如上图的”- (void)eat;” 在声明了类的行为和属性之后,我们还必须来实现类的行为,例如,
@implementation Dog
- (void)eat // 狗吃了后的体重
{
weight +=1;
NSLog(@"狗吃了的体重是%f",weight); // 打印出狗的体重}
- (void)run // 狗跑了后的体重
{
weight -= 1 ;
NSLog(@"狗体重是%f",weight); // 打印出狗的体重
}
@end
大括号里就是对方法的实现。
类创建好了之后,我们在运用过程中,就可以根据类的属性创建一个实在的对象;比如 “Dog *d=[dog new]; ” 创建一个具体学生对象。建这样就把雷和对象都创建好了。
3、方法和成员变量
方法,即我们的对象的实现方法,它是这个类所有对象都可以使用的行为,只要我们的新对象调用这方法,那么这对象就会做出这个动作,例如,当“d”这个新对象调用”- (void)eat”这个方法,那么它就会执行吃这个动作,结果就是体重增加1.在OC中常这样表示,[d run]。
成员变量,描述我们类的特性的一些变量,如上面的“double weight;Color curcolor;”,它们是对类的一个描述。当然在创建一个新的对象之后,我们需要给新对象的成员变量赋值。这里的赋值我们一般采用指针(当为公共变量)或者set函数赋值(当为私有或者局部变量),例如,“d->curcolor = ColorGreen; // 给狗一个毛色 d->weight=30; // 给狗体重”,”或者 [d setWeight :30]”,或者”d.weight = 30
4、对象的内存分析
我们建立一个新的对象之后,内存就会留出一块空间来存储这个对象。那么对象内部就会存储这对象的所有属性和方法。当我们定义一个指针P时,内存也会给指针一个空间,这个空间就存储了对象的地址,所以我们利用P来调用对象。实质上,我们在创建新对象之前,内存已经用了一个空间存储了类,而新建好的对象里面默认了一个ISa指针用来存储类的地址(也就是我们说的指向类),但我们用[p weight]时,它会先到新对象这内存去找weight这以变量,找不到然后顺着指针isa去类这内存去找,最后才才做出这一行为。如下图
5、注意事项
1)、对象方法参数与函数参数 方法参数的表达:- (void)speedCompareompareWithOther :(int)other而函数参数的表达式:void peedCompareompareWithOther (intA,intB)。注意它们的括号,方法里面的小括号只用来括数据类型的,而函数里面的小括号是用来括传入的参数的。
2)、@interface…@end一定一对,成员变量和方法声明一定写在它们之间,方法的实现一定在“@impelementation …@end”之间 3)、成员变量不允许在声明中初始化,要设一个初始值需要写一个方法即,重写init,例如;
Person *d = [[Dog alloc] init];- (id)
init{
self = [super init];
if (self != nil)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>weight = 10;
};
<span style="white-space:pre"> </span>return self;}
4)、类的设计合理性
在这个类要用另外一个类的方法的时候,我们要把另外的一个类要写进这个类的属性,这样才能用另外一类的相关方法属性。例如,
@interface Student:NSObject
{
@public
Sex sex;
Date birthday;
Color favColor;
Dog *dog;
NSString *name ;
}
- (void)liudog; // 遛狗
- (void)weigou; // 喂狗
- (void)print;
@end
实际上OC会有一个继承和多态来解决这问题。
5)当我们用”[Dog new]->weight = 20”来代替”Dog *d = [Dog mew];d->weight = 20,”时,我们要注意,再次[Dog new]->weight = 50这样赋值之后那么weight的值会变为50,而不会再说20。这种写法会导致第一个[Dog new]一直在内存中占用内存,是内存的利用率降低,因此实际项目中,不会这样写,要写成Dog *d = [Dog mew];d->weight = 20”。
最后加一个类和对象的一个程序(文中节选的程序片段出之于此程序)
#import <Foundation/Foundation.h>
// 定义一个关于性别的枚举类型
Sextypedef enum {
SexMan, // 男性
SexWoman // 女性
} Sex;
//定义一个关于日期的结构体类型
typedef struct {
int year; // 年
int mouth; // 月
int day; // 日
} Date;
// 定义一个关于颜色的枚举类型
typedef enum {
ColorBlack, // 黑色
ColorRed, // 红色
ColorGreen // 绿色
} Color;
/* 学生 成员变量:性别、生日、狗的重量、狗的毛色、狗 方法:吃、跑步、遛狗、喂狗 */
@interface Dog :NSObject // 狗的成员变量:体重、毛色、吃,跑
{ @public
double weight;
<span style="white-space:pre"> </span>Color curcolor;}
- (void)eat;
- (void)run;//keyi加;
-(void)dealloc;
/* 可以写成: @property(nonatoimc , assign) double weight @property(nonatoimc , assign) color curcolor */
@end
// 狗的方法的实现
@implementation Dog- (void)eat // 狗吃了后的体重
{
weight +=1;
NSLog(@"狗吃了的体重是%f",weight); // 打印出狗的体重
}
- (void)run // 狗跑了后的体重
{
weight -= 1 ;
NSLog(@"狗体重是%f",weight); // 打印出狗的体重
}
/*
-(void)dealloc //内存管理的
{
[self release];
[super dealloc];
}
*/
@end
//学生的类的建立,对象属性,性别,生日,喜欢的颜色,姓名,他的狗,遛狗。喂狗
#import<Foundation/Foundation>
#import "Dog.h"
@interface Student:NSObject
{
@public
Sex sex;
Date birthday;
Color favColor;
Dog *dog;
NSString *name ;
}
/* 内存管理写法
@property(nonatomic,assign) Sex sex
@property(nonatomic,assign) Date birthday
@property(nonatomic,assign) char *name
@property(nonatomic,asign) Color favcolor
@property(nonatomic,retain) Dog *dog
*/
- (void)liudog; // 遛狗
- (void)weigou; // 喂狗
- (void)print;@end
// 人的方法实现
@implementation Student
- (void)print
{
NSLog(@"姓名%@,性别%d,喜欢的颜色%d,生日%d-%d-%d",name,sex,favColor,birthday.year,birthday.mouth,birthday.day);
}
// 遛狗的方法实现
- (void)liudog
{
[dog run];
}
// 喂狗的方法实现
- (void)weigou
{
[dog eat];
}
/*-(void)dealloc //内存管理的
{
[self release];
[super dealloc];
}
*/
@endint main()
{
Student *s=[Student new]; // 创建一个具体学生对象
Dog *d =[Dog new]; // 创建一个具体的DOg对象
s->favColor = ColorGreen;
d->curcolor = ColorGreen; // 给狗一个毛色
d->weight=30; // 给狗体重
s->name = @"jonk";
s->dog = d; // 最重要的,把狗给一个特定的人
s->sex = SexMan; // 给学生定义性别
Date date = {1990,8,26};
s->birthday = date; // 给学生定义生日
[s liudog];// 遛狗
[s weigou]; // 喂狗
[s print];
return 0 ;
}
/* 由于内存管理的原因还可以这么写
int main()
{
<span style="white-space:pre"> </span>@autoreleasepool {
<span style="white-space:pre"> </span>Student *s = [[Student alloc] autorelease];
<span style="white-space:pre"> </span> Dog *d = [[Dog alloc] autorelease];<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> d.curcolor = colorGreen;
<span style="white-space:pre"> </span> d.weight = 30;
<span style="white-space:pre"> </span> s.dog = d;
<span style="white-space:pre"> </span> s.sex = SexMan;
<span style="white-space:pre"> </span> Date d = {1990,8,26};
<span style="white-space:pre"> </span> s.birthday = d;
<span style="white-space:pre"> </span> [s print];
}
<span style="white-space:pre"> </span> return 0;
}
*/