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行駛