OC的第二个类
Touch第二个类文件.m
Open 第二个类文件.m
/*
人
类名:Person
属性(成员变量\实例变量):体重、年龄
行为(方法):走路
*/
/*1.类的声明
*成员变量
*方法的声明
*/
例一:
#Imort <Foundation/Foundation.h>
@interface Person:NSObject
{
//成员变量;(成员变量必须写在大括号里面)
@public
Int age;
double weight;
}
-(void)walk;
@end
//方法声明;
//2.类的实现
@implementation Person
//实现@interface中声明的方法
-(void)walk
{
NSLog(@”走了一段路”);
}
@end
Int main()
{
Person*p=[Person new];
P->age=2;
p->weight=50.0;
[P walk];
Return 0;
}
例二:
#Imort <Foundation/Foundation.h>
@interface Person:NSObject
{
//成员变量;(成员变量必须写在大括号里面)
@public
Int age;
double weight;
}
-(void)walk;
@end
//方法声明;
//2.类的实现
@implementation Person
//实现@interface中声明的方法
-(void)walk
{
NSLog(@”%i岁、%f公斤的人走了一段路”,age,weight);
}
@end
Int main()
{
Person*p=[Person new];
P->age=2;
p->weight=50.0;
[P walk];
Person *p2=[Personnew];
P2->age=30;
P2->weight=60.0;
[P2 walk];
return 0;
}
例三:
#Imort <Foundation/Foundation.h>
@interface Person:NSObject
{
//成员变量;(成员变量必须写在大括号里面)
@public
Int age;
double weight;
}
-(void)walk;
@end
//方法声明;
//2.类的实现
@implementation Person
//实现@interface中声明的方法
-(void)walk
{
NSLog(@”%i岁、%f公斤的人走了一段路”,age,weight);
}
@end
Int main()
{
Person*p=[Person new];
p->age=20;
Person*p2=[Person new];
P2->weight=50.0
[pwalk];
return 0;
}
这段代码执行的结果为:
例四:
#Imort <Foundation/Foundation.h>
@interface Person:NSObject
{
//成员变量;(成员变量必须写在大括号里面)
@public
Int age;
double weight;
}
-(void)walk;
@end
//方法声明;
//2.类的实现
@implementation Person
//实现@interface中声明的方法
-(void)walk
{
NSLog(@”%i岁、%f公斤的人走了一段路”,age,weight);
}
@end
Int main()
{
Person*p=[Person new];
p->age=20;
p->weight=50.0;
Person*p2=p;
p->age=30;
[pwalk];
return 0;
}
这段代码执行的结果为:
此过程内存分析:
例五:
#Imort <Foundation/Foundation.h>
@interface Person:NSObject
{
//成员变量;(成员变量必须写在大括号里面)
@public
Int age;
double weight;
}
-(void)walk;
@end
//方法声明;
//2.类的实现
@implementation Person
//实现@interface中声明的方法
-(void)walk
{
NSLog(@”%i岁、%f公斤的人走了一段路”,age,weight);
}
@end
Int main()
{
Person*p=[Person new];
p->age=20;
p->weight=40;
Person*p=[Person new];
P2->age=30;
P2->weight=50
P=p2
P2->age=40;
[p2 walk];
return 0;
}
这段代码执行的结果为:
内存分析:
综上所属,本章节主要讲的是指针的属性,当指针指向谁就改变谁的值!
例六:增加一个方法
#Imort <Foundation/Foundation.h>
@interface Person:NSObject
{
//成员变量;(成员变量必须写在大括号里面)
@public
Int age;
double weight;
}
-(void)walk;
-(void)eat;
@end
//方法声明;
//2.类的实现
@implementation Person
//实现@interface中声明的方法
-(void)walk
{
NSLog(@”%i岁、%f公斤的人走了一段路”,age,weight);
}
-(void)eat
{
NSLog(@”%i岁、%f公斤的人吃饭了”,age,weight);
}
@end
Int main()
{
Person*p=[Person new];
p->age=20;
p->weight=40;
[p eat];
[p walk];
return 0;
}
例七:
#Imort <Foundation/Foundation.h>
@interface Person:NSObject
{
//成员变量;(成员变量必须写在大括号里面)
@public
Int age;
double weight;
}
-(void)walk;
-(void)eat;
@end
//方法声明;
//2.类的实现
@implementation Person
//实现@interface中声明的方法
-(void)walk
{
NSLog(@”%i岁、%f公斤的人走了一段路”,age,weight);
}
-(void)eat
{
NSLog(@”%i岁、%f公斤的人吃饭了”,age,weight);
}
@end
Int main()
{
Person*p=[Person new];
p->age=20;
p->weight=40;
[p eat];
[p walk];
Person*p2=[Person new];
P2->age=30;
P2->weight=50;
[p2 eat];
[p2 walk];
return 0;
}
分析再内存中的细节分析:
每个对象都占用一个存储空间;
类在内存中也占据存储空间,但是只占据一个存储空间;当你第一次使用类的时间被创建再内存空间中;
在使用类创建对象之前,会将类加载到内存
每个对象内部都有一个默认的指针——isa,isa指针的作用是指向同一个类;
OC中对象跟函数的注意点
例一:
#Import <Foundation/Foundation.h>
@Interface Car:NSObject
{
//成员变量
@public
Int wheels;
Int speed;
}
-(void)run;
@end
@implementation Car
-(void)run;
{
NSLog(@“%d个轮子,速度为%dkm/h的车子跑起来”,wheels。speed);
}
@end
Void test(int w,int s)
{
W=20;
S=200;
}
Int main()
{
Car *c=[Car new];
c->wheels=4;
c->speed=250;
test(c->wheels, c->speed);
[c run];
return 0;
}
这段代码的运行结果是:
例二:
#Import <Foundation/Foundation.h>
@Interface Car:NSObject
{
//成员变量
@public
Int wheels;
Int speed;
}
-(void)run;
@end
@implementation Car
-(void)run;
{
NSLog(@“%d个轮子,速度为%dkm/h的车子跑起来”,wheels。speed);
}
@end
Void test(int w,int s)
{
W=20;
S=200;
}
Void test1(Car *newC)
{
newC->wheels=5;
}
Int main()
{
Car *c=[Car new];
c->wheels=4;
c->speed=250;
test1(c);
[c run];
return 0;
}
这段代码的运行结果是:
内存分析:
例三:
#Import <Foundation/Foundation.h>
@Interface Car:NSObject
{
//成员变量
@public
Int wheels;
Int speed;
}
-(void)run;
@end
@implementation Car
-(void)run;
{
NSLog(@“%d个轮子,速度为%dkm/h的车子跑起来”,wheels。speed);
}
@end
Void test(int w,int s)
{
W=20;
S=200;
}
Void test1(Car *newC)
{
newC->wheels=5;
}
Void test2(Car *newC)
{
Car *c2=[Car new];
c2->wheels=5;
c2->speed=300;
newC->wheels =6
}
Int main()
{
Car *c=[Car new];
c->wheels=4;
c->speed=250;
test2(c);
[c run];
return 0;
}
这段代码的运行结果是:
整个过程中对象c指向的一直都是第一个内存地址所以输出的跟对象C2没有任何关系
常见错误.
1.@interface和@implementationde 分工
1)@interface就好像暴露在外面的时钟表面
2)@implementation就好像隐藏在时钟内怒的构造实现
2.声明和定义多个类
3.常见的错误
1)只有类的声明没有类的实现
2)漏掉@end
3)@interface与@implementation嵌套
4)两个类的声明嵌套
5)成员变量没有有些在括号里面
6)方法的声明卸载了大括号的里面
4.语法细节
1)成员变量不能再{}中进行初始化、不能被直接拿出去访问
2)方法不能当作函数一样调用
3)成员变量\方法不能使用static等关键次修饰,别跟C语言混在一起
4)类的实现可用写在卖弄函数的后面,主要把声明放在前面就行了
5、OC方法和函数的区别
1)OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间,也就是说OC方法不能独立于类的存在
2)C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
3)对象方法都是以减号开头,函数属于整个文件可以放到文件的任何一个地方,但是不能放到声明文件(@interface和@end之间)中去,假如函数放到了主函数的后面,必须要在主函数中进行调用!函数的调用不依赖与对象!
4)在声明中注意成员变量时候被全局调用,再声明中成员变量默认的为@protected不是@public
5)函数内部是不能直接通过成员变量名访问某个对象的变量。
基本类型的属性
/*
学生
成员变量:性别、生日、体重、最喜欢的颜色、狗(体重,吃,跑)
方法:吃、跑、遛狗、喂狗
*/
Typedef enum{
SexMan,
SexWoman
}Sex//枚举常量一定要包含枚举类型的名称,前面加一个K表示是常量
Typedef struct{
Int year;
Int month;
Int day;
}Date
Typedef enum{
ColorBlack;
ColorRed;
ColorYellow;
}Color
#import<Foundation/Foundation.h>
@interface Student : NSObject
{
//如果变量有固定的类型一般都用枚举
@public
Sex sex;//性别
Datebirthday;//生日
Double weight;//体重(KG)
Color facColor;//最喜欢的颜色
Char *name;
}
-(void)eat;
-(void)run;
-(void)print;
@end
@implementationStudent
-(void)eat
{
Weight +=1;//每吃一次体重就+1
NSLog(@“吃完这次后的体重是%d”,weight);
}
-(void)run
{
Weight-=1;//没跑完运动一次体重就-1
NSLog(@“跑完这次后的体重是%d”,weight);
}
-(void)print
{
NSLog(@”性别=%d,喜欢的颜色=%d,姓名=%c,生日为%d-%d-%d”,sex,favColor,name,birthday.year,birthday.maonth,birthday.day);
}
@end
Intmain()
{
Student *s=[Studentnew];
s->name=”Jack”;
s->weight=50;
//性别
s->sex=SexMan;
//s->birthday={2011,9,10};这个写法是错误的
Date d={2011,9,10};
s->birthday=d;
/*
上面两行代码等价于下面的三行代码
s->birthday.year=2011;
s->birthday.month=9;
s->birthday.day=10;
*/
s->facColor=ColorBlack;
[s eat];
[s eat];
[s run];
[s run];
[s print];
return0;
}
例二:
/*
学生
成员变量:性别、生日、体重、最喜欢的颜色、狗(体重,毛色,吃,跑)
方法:吃、跑、遛狗、喂狗
*/
Typedef enum{
SexMan,
SexWoman
}Sex//枚举常量一定要包含枚举类型的名称,前面加一个K表示是常量
Typedef struct{
Int year;
Int month;
Int day;
}Date
Typedef enum{
ColorBlack;
ColorRed;
ColorYellow;
}Color
#import<Foundation/Foundation.h>
@interface Student : NSObject
{
//如果变量有固定的类型一般都用枚举
@public
Sex sex;//性别
Datebirthday;//生日
Double weight;//体重(KG)
Color facColor;//最喜欢的颜色
Char *name;
}
-(void)eat;
-(void)run;
-(void)liuDog;
-(void)weiDog;
-(void)print;
@end
@interface Dog :NSObject
{
Double weight;// 体重
Color curColor;//毛色
}
-(void)eat;
-(void)run;
@end
@implementation Dog
-(void)eat;
{
[Dog eat];
}
-(void)run;
{
[Dogeat];
}
@end
@implementationStudent
-(void)eat
{
Weight +=1;//每吃一次体重就+1
NSLog(@“吃完这次后的体重是%d”,weight);
}
-(void)run
{
Weight-=1;//没跑完运动一次体重就-1
NSLog(@“跑完这次后的体重是%d”,weight);
}
-(void)liuDog
{
Weight-=1;//没跑完运动一次体重就-1
NSLog(@“溜完狗之后的体重是%d”,weight);
};
-(void)weiDog;
{
Weight +=1;//每吃一次体重就+1
NSLog(@“喂完狗之后的体重是%d”,weight);
}
-(void)print
{
NSLog(@”性别=%d,喜欢的颜色=%d,姓名=%c,生日为%d-%d-%d”,sex,favColor,name,birthday.year,birthday.maonth,birthday.day);
}
@end
Intmain()
{
Student *s=[Studentnew];
Dog d = [Dog new];
d->curColor=ColorYellow;
d->weight=20;
s->dog = d;
s->name=”Jack”;
s->weight=50;
//性别
s->sex=SexMan;
//s->birthday={2011,9,10};这个写法是错误的
Date d={2011,9,10};
s->birthday=d;
/*
上面两行代码等价于下面的三行代码
s->birthday.year=2011;
s->birthday.month=9;
s->birthday.day=10;
*/
s->facColor=ColorBlack;
[s eat];
[s eat];
[s run];
[s run];
[s print];
[s liuDog];
[s weiDog];
return0;
}
方法的声明跟实现的深入了解
例题
/*
计算器类
方法:
1. 返回π
2. 计算两个整数的和
3. 计算某个整数的平方
*/
#import<Foundation/Foundation.h>
@interfaceJiSuanQi : NSObject
{
}
-(void)pi;
//在OC方法中,一个参数对应一个冒号
-(int)PingFang:(int)num;
-(int)sumWithNum1:(int)num1 andNum2:(int)num2;
@end
@implementation JiSuanQi
-(void)pi;
{
Return3.1415926;
}
-(int)pingFang:(int)num
{
Return num*num;
}
-(int)sumWithNum1:(int)num1 andNum2:(int)num2
{
Return num1+num2;
}
@end
Int main()
{
JiSuanQi jsq = [JiSuanQi new];
Double a=[Jsqpi];
NSLog(@”π的值为:%f”,a);
Int b=[jsq pingFang:10];
NSLog(@”这个整数的平方是%d”,b);
Int c=[jsq sumWithNum1:10 andNum2:5];
NSLog(@”这两个整数的和是%d”,c);
Return 0;
}
本章小结:
1)一个参数对应一个冒号,当有多个参数的时间要对每个参数进行描述!
2)如果带参数的方法的命名中冒号也是方法名的一部分
提示:再xcod中再上面有一个Interface中能快速查看方法名!
练习
给Car类设计一个方法,用来和其他车比较车速,返回差距的车数;
#import<Foundation/Foundation.h>
@interfaceCar : NSObject
{
@public
Int speed;
}
-(int)compareSpeedWithOther:(Car *)other;
@end
@implementationCar
-(int)compareSpeedWithOther:(Car *)other
{
//speed
//other->speed
Return speed-other->soeed;
}
@end
Int main()
{
Car *c1=[Car new];
c1->speed=300;
Car *c2=[Car new];
c1->speed=280;
int a=[c1 compareSpeedWithOther:c2];
NSLog(@“%d”,a);
return 0;
}
匿名对象
#import<Foundation/Foundation.h>
@interfaceCar : NSObject
{
@public
Int speed;
}
-(int)run;
@end
@implementationCar
-(int)run
{
NSLog(@”速度为%d的车子跑起来”,speed);
}
@end
Int main()
{
Car *c=[Car new];
c->speed=300;
[c run];
return 0;
}
匿名对象格式为:
#import<Foundation/Foundation.h>
@interfaceCar : NSObject
{
@public
Int speed;
}
-(int)run;
@end
@implementationCar
-(int)run
{
NSLog(@”速度为%d的车子跑起来”,speed);
}
@end
Int main()
{
[Car new]->speed=300;
[[Car new] run];
return 0;
}
注意一般不要些匿名对象的代码否则会造成内存泄漏!
本文出自 “我成IT成长之路” 博客,请务必保留此出处http://jeason.blog.51cto.com/9704473/1588120
原文地址:http://jeason.blog.51cto.com/9704473/1588120