用OC完整的写一个函数,需要函数的声明和定义(实现)
用OC完整的写一个类,需要类的声明和实现
类的声明和实现:
#import <Foundation/Foundation.h>
<<1.类的声明:>>
//NSObject 目的是: 让Car这个类具备创建对象的能力
@interface Car : NSObject //加一个类名
{//用来声明对象属性
//@public 可以让外部的指针间接访问对象内部的成员变量
@public //只需声明一次
int wheels;//轮胎个数
int speed;//时速
}
//方法(行为)
//只要是OC对象的方法,必须以减号 - 开头
//OC方法中任何数据类型都必须用小括号()括住,小括号()就这一个作用
- (void)run;//不写在大括号{}里面
@end //类的声明完毕
<<2.类的实现:>>
//用来实现interface中声明的方法
@implementation Car
//方法的实现(类的实现)
- (void)run{
NSLog(@"");
}
@end
int main()
{
//在OC中,想执行一些行为,就要写上一个中括号[ 行为执行着 行为名称]
Car *p=[Car new] ;//执行了Car这个类的new行为来创建新的对象
Car *p2=[Car new] ;
p->wheels=4;
p->speed=250;
[p2,run];
p2->wheels=5;
p2->speed=300;
//给p所指向对象发送一条run消息
[p,run];
NSLog(@"车子有%d个轮子,时速%d",p->wheels,p2->speed);
return 0;
}
OC修改数据必须使用指针
Car *p =[Car new];//定义一个指针变量p,p将来指向的是Car类型的函数,p存储[Car new]返回的地址
OC对象的本质就是结构体
p->wheels=4;//给p所指对象的wheels属性赋值
(instance variable)实例变量=成员变量
@public 可以让外部的指针间接访问对象内部的成员变量,只需创建一次
[Car new] 没出现一次就创建一个新对象,新地址
第二个实例:
#import <Foundation/Foundation.h>
@interface Person:NSObject
{
int age;
double weight;
}
- (void)walk;
- (void)ead;
@end
@implementation Person
//实现@interface中声明的方法
- (void)walk{
//对象访问这个方法,则可以直接使用成员变量
NSLog(@"%d岁,%f公斤的人走了一段路",age,weight);
}
-(void)eat{
NSLog(@"@"%d岁,%f公斤的人在吃东西",age,weight");
}
@end
int main(){
Person *p=[Person new];
p->age=20;
p->weight=50.0;
[p walk];//若有成员变量age没有赋值,则默认为0
Person *p2=[Person new];
p2->age=30;
p2->weight=60.0;
[p2 walk];
Person *p3=p;
p3->age=33;//会改变第一个p的age值
[p eat];
return 0;
}
OC对象和函数的关系:
OC对象和函数的关系:
#import <Foundation/Foundation.h>
@interface Car : NSObject
{//成员变量
@public
int wheels;
int speed;
}
- (viod)run;
@end
@implemention 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=c2;//newc指向了c2的地址空间,所以不会改变调用这个方法的指针所指Car对象的值
newc->wheels=6
}
int main()
{
Car *c = [Car new];
c-wheels=4;
c->speed=250;
//test(c->wheels,c->speed);
//[c,run];//4,250
test1(c);
//[c,run];//5,250
test2(c);
//[c,run];//4,250
return 0;
}
若想写多个类:
@interface Car : NSObject
{
int wheels;//只允许类型+变量名
int wheels=4;//不允许赋值,只能声明成员变量;不可以重复写;
static int wheels;//不可以
}
@end
@implementation Car
-(void)run{//没有内部方法的概念,方法是方法,函数是函数
NSLog(@"");
}
@end
@interface Person : NSObject
{
int age;
}
@end
@implementation Person
-(void)walk{
NSLog(@"");
}
@end
类的声明必须放前面,类的实现可以放后面
函数和 方法的区别:
1.方法的声明只能写在@interface 和 @end中间
2.方法的实现只能写在@implementation 和 @end中间
3.对象方法归类/对象所有
4.run()是调用函数的形式 [c,run]是调用方法的形式
5.函数可以写在任何地方,它属于文件所有,不依赖于任何对象,包括@implementation 内,但是在@interface中声明可能有问题。
@implementation Car
void test()
{
NSLog("@调用了test函数");
}
- (void)run
{
test();
NSLog(“@调用了run方法”);
}
@end
类的合理设计:
/*学生:
成员变量:性别,生日,体重,颜色,狗(体重,毛色,吃,跑)
方法:吃,跑步,遛狗(让狗跑),喂狗(让狗吃)
*/
#import <Foundation/Foundation.h>
typedef enum
{
SexMan,
SexWoman//以枚举名称开头+枚举常量
} Sex;
typedef struct
{
int year;
int month;
int day;
} Date;
typedef enum
{
ColorBlack,
ColorRed,
ColorGreen
} Color;
//1.声明并实现Dog类
@interface Dog : NSObject
{
@public
double weight;
Color curColor;
}
- (void)eat;//狗吃
- (void)run;//狗跑
@end
@implementation Dog
- (void)eat//狗吃
{
weight+=1;//每吃一次,体重加1
NSLog(@"狗吃完后,体重=%fkg",weight);
}
- (void)run//狗跑
{
weight-=1;
NSLog(@"狗跑完后,体重为=%fkg",weight);
}
@end
//2.声明并实现Student类
@interface Student : NSObject
{
@public
char *name;
//BOOL sex;//不清楚
Sex sex;//性别
Date birthday;//生日
double weight;//体重(kg)
Color favColor;//颜色
Dog *dog;
}
- (void)eat;//学生吃
- (void)run;//学生跑
- (void)liuDog;//学生遛狗
- (void)weiDog;//学生喂狗
- (void)print;//打印学生的所有方法
@end
@implementation Student
- (void)eat//学生吃
{
weight+=1;//每吃一次,体重加1
NSLog(@"学生吃完后,体重=%fkg",weight);
}
- (void)run//学生跑
{
weight-=1;
NSLog(@"学生跑完后,体重为=%fkg",weight);
}
- (void)liuDog//学生遛狗
{
//让狗跑起来
[dog run];
}
- (void)weiDog//学生喂狗
{
//让狗吃东西
[dog eat];
}
- (void)print
{
NSLog(@"性别=%d,喜欢的颜色=%d,姓名=%s,生日=%d-%d-%d",sex,favColor,name,birthday.year,birthday.month,birthday.day);
}
@end
//3.主函数
int main()
{
Student *s=[Student new];
s->weight=50;//体重
s->name="jack";//名字
s->sex=SexMan;//性别
//s->birthday={2011,9,10};//这样是错误的
/*
//第一种写法:
s->birthday.year=2011;//结构体内部成员用点
s->birthday.month=9;
s->birthday.day=10;
//第二种写法:
Data d=s->birthday;
d.year=2011;
d.month=2011;
d.day=2011;
s->birthday=d;
*/
//第三种写法:
Data d={2011,9,10};//生日 在定义结构体变量的同时才是这样的写法
s->birthday=d;
//s->dog=[Dog new];
Dog d=[Dog new];//学生的狗
d->weight=20;
d->curColor=ColorGreen;
s->dog=d;
[s liuDog];
[s weiDog];
[s,eat];
[s,eat];
[s,run];
[s,run];
[s print];
return 0;
}