代碼編寫函數
定義一個Car類,擁有2個屬性:輪子數、時速,1個行爲:跑spa
類名\屬性的命名規則:標示符的規則設計
類名的命名規範:有意義、駝峯標識、首字母大寫指針
#import <Foundation/Foundation.h>對象
// 類的聲明內存
@interface Car : NSObject編譯器
{io
@public編譯
int wheels; // 多少個輪子import
int speed; // 時速
}
- (void)run; // 跑的行爲
@end
類的聲明02
成員變量
@interface的大括號{}中聲明的變量:wheels、speed
@interface的大括號和函數的大括號是不同的
默認會初始化爲0
@public
@public可讓Car對象的wheels和speed屬性被外界訪問
NSObject
加上:NSObject的目的是讓Car類具有建立對象的能力
類的實現
// 類的實現
@implementation Car
- (void) run
{
NSLog(@"%i個輪子,%i時速的車子跑起來了", wheels, speed);
}
@end
建立對象01
// 主函數
int main()
{
// 建立車子對象
Car *c = [Car new];
c->wheels = 3;
c->speed = 300;
[c run];
return 0;
}
建立對象02
main函數的代碼分析、內存分析(對象在內存中有成員)
[Car new]每次都會建立出新的對象,而且返回對象的地址,那麼就應該用一個指針變量保存對象的地址
Car *c = [Car new];
用一個指針變量c指向內存中的Car對象
設置車子對象的屬性
跟用指向結構體的指針訪問結構體屬性同樣,用->
c->wheels = 3;
c->speed = 300;
建立多個Car對象
分別只設置wheels、speed屬性
Car *c1 = [Car new];
c1->wheels = 4;
Car *c2 = [Car new];
c2->speed = 250;
[c1 run];
1個賦值給另外一個,而後修改屬性
Car *c1 = [Car new];
c1->wheels = 4;
c1->speed = 250;
Car *c2 = c1;
c2->wheels = 3;
[c1 run];
面向對象封裝的好處
更加接近人類的思考方式
只須要關注對象,不須要關注步驟
對象與函數參數
對象成員變量做爲函數參數
指向對象的指針做爲函數參數
修改指向指向對象的成員
修改指針的指向(指向某對象的指針即指針的指針)
@interface和@implementation的分工
@interface就好像暴露在外面的時鐘表面
@implementation就好像隱藏在時鐘內部的構造實現
常見錯誤
只有類的聲明,沒有類的實現
漏了@end
@interface和@implementation嵌套
兩個類的聲明嵌套
成員變量沒有寫在括號裏面
方法的聲明寫在了大括號裏面
語法細節
成員變量不能在{}中進行初始化、不能被直接拿出去訪問
方法不能當作函數同樣調用
成員變量\方法不能用static等關鍵字修飾,別跟C語言混在一塊兒(暫時忽略)
類的實現可用寫在main函數的後面,主要在聲明後面就好了
OC方法和函數的區別
OC方法只能聲明在@interface和@end之間,只能實如今@implementation和@end之間。也就是說OC方法不能獨立於類存在
C函數不屬於類,跟類沒有聯繫,C函數只歸定義函數的文件全部
低級錯誤:方法有聲明,可是實現的時候寫成了函數
OC的方法注意
方法只有聲明,沒有實現(經典錯誤)
方法沒有聲明,只有實現(編譯器警告,可是能調用,OC的弱語法)
編譯的時候:訪問沒有的成員變量直接報錯,訪問沒有的方法,只是警告
@implementation01
沒有@interface,只有@implementation,也是能成功定義一個類的
@implementation Car : NSObject
{
@public
int wheels; // 多少個輪子
int speed; // 時速
}
- (void) run
{
NSLog(@"%i個輪子,%i時速的車子跑起來了", wheels, speed);
}
@end
@implementation02
@implementation中不能聲明和@interface同樣的成員變量
不帶參數的方法01
設計一個返回PI的方法
帶一個參數的方法01
設計一個計算平方的方法
帶多個參數的方法01
設計一個計算和的方法
方法名注意
冒號也是方法名的一部分
同一個類中不容許兩個對象方法同名
屬性訪問
[Car new]->speed = 200;
方法調用
[ [Car new] run];