Objective-C中的类学习第一篇
1.类的设计:
1> 类名(第一个字母大写,不要用下划线)
2> 属性
3> 行为(功能)
//因为使用了NSObject
#import<Foundation/Foundation.h>
/*
类名:Car
属性:轮胎个数,速度
行为:跑
*/
//类的声明
//用来声明对象的属性和行为
//:NSObject 目的是:让Car这个类具备创建对象的能力
@interface Car : NSObject
{//用来声明对象属性
@public
//int wheels = 4;不允许在这里初始化
//static int wheels;不允许随便讲成员变量当做C语言中的变量来使用
int wheels;//轮胎个数
int speed;//时速(km/h)
}
//方法(行为):方法名、参数、返回值
//只要是OC对象的方法,必须以减号 - 开头
//OC方法中任何数据类型都必须用小括号()扩住
//OC方法中的():括住数据类型
//方法是方法,不是函数,不可以使用static等来修饰。
- (void) run;
@end
//类的实现
@implementation Car
//方法的实现(说清楚方法里面有什么代码)
- (void)run
{
NSLog(@"车子跑起来了!");
}
@end
int main()
{
//在OC中,想执行一些行为/方法,就写上一个中括号[行为执行者 行为名称]
//利用类来创建对象
//执行了Car这个类的new行为来创建新对象
//定义了一个指针变量p,p将来指向的是Car类型的对象
//[Car new]每次都会创建出一个新的对象,并返回新对象的地址
Car *p = [Car new];
Car *p2 = [Car new];
p2->wheels = 5;
p2->speed = 300;
//给p所指向的对象的wheels属性赋值
p->wheels = 4;
p->speed = 250;
//给p所指向的对象发送一条run消息
[p run];
NSLog(@"车子有%d个轮子,时速:%dkm/h",p->wheels,p->speed);
return 0;
}
下面对于类对象的内存分配中的一个易错点举个小例子
@interface Car : NSObject
{
@public
int wheels;
int speed;
}
-(void) run;
@end
@implementation Car
-(void)run
{
NSLog(@"%d个轮子的车子,以速度%d km/h行驶",wheels,speed);
}
@end
void test(int w,int s)
{
w = 20;
s = 300;
}
void test1(Car *newC)
{
//newC这个指针修改了c这个对象所在地址中对应的值
newC->wheels = 5;
}
void test2(Car *newC)
{
Car *c2 = [Car new];
c2->wheels = 5;
c2->speed = 200;
//此时,newC指向了新的对象c2
newC = c2;
//所以这个时候,newC修改的是c2中的wheels的值,而不是c中的值,c对象并未受影响
newC->wheels = 6;
}
int main()
{
Car *c = [Car new];
c->wheels = 4;
c->speed = 100;
//test(c->wheels,c->speed); //此时只是传入了c指向的对象中的wheels、speed的值,等同于test(4,100)。
//test1(c);
test2(c);
[c run];
return 0;
}
test 的结果是4个轮子的车子,以速度100 km/h行驶
test1的结果是5个轮子的车子,以速度100 km/h行驶
test2的结果是4个轮子的车子,以速度100 km/h行驶