學習目標
1.【了解】Objective-C語言簡介
2.【掌握】第一個OC程序
3.【掌握】OC中的字符串
4.【熟悉】OC中的一些玩意
5.【了解】面向過程與面向對象
6.【掌握】類的聲明和實現
7.【掌握】類的方法
一、Objective-C語言簡介
Objective-C簡稱Obj-C或者OC,Objective的意思就是面向對象的。OC其實就是在C語言的基礎之上,封裝了一層面向對象的語法,他并不是一門全新的編程語言。OC是Mac OS X系統和iOS系統的主要開發編程語言,當然馬上要被Swift給替代了,然并卵,我們還是得好好學習OC,因為現在大多數公司還是使用OC來做iOS開發。
二、第一個OC程序
OC程序的后綴和入口
C程序的源文件的后綴名為.c,OC程序的源文件是后綴名為.m,m就是message的意思。因為OC是完全兼容C語言的,所以在.m文件之中是可以寫任意的C代碼。并且OC中main函數仍然是OC程序的入口,作用和C語言中的是一樣的,這里就不贅述了。
#import指令
他是一個增強版的#incluce指令,并且用法和#include指令的用法相同。并且#import在包含文件的時候會先判斷這個文件是否已經被包含,如果沒有被包含就包含,如果已經被包含,就算了。
框架
蘋果或者第三方事先將一些牛逼(常用)的功能寫好,把這些功能模塊封裝在一個一個類之中,把這些功能提供給大家用。這些類的集合就叫做框架,說白了就是一個功能集合。
Foundation框架
提供了一些OC最基礎的功能。Foundation.h這個文件中包含了所有Foundation框架中的頭文件,#import 就相當于包含了所有Foundation框架的頭文件。
@autoreleasepool
他是一個自動釋放池,管理內存的,到時候再扯。
NSLog函數
是printf函數的增強版,作用也是向控制臺輸出信息。
1.NSLog輸出完畢信息之后會默認加一個\n,如果我們手動加了一個\n,NSLog的自動換行就會失效。
2.在輸出信息的同時還會輸出一些與程序有關的其他信息(系統時間、程序名、進程ID、線程ID)。
3.NSLog函數支持printf函數的全部格式控制符,其用法也相同。
4.NSLog函數的字符串參數前面必須要加一個@符號,這是OC里的字符串格式。
5.NSLog可以使用%@格式控制符輸出對象,而printf不能輸出對象。
6.NSLog函數的第一個參數是NSString類型的指針,所以必須給一個OC字符串。
三、OC中的字符串
C語言使用字符數組和字符指針的方式來存儲字符串,OC中專門設計了一個新的數據類型(NSString)來保存字符串。我們無需關心內部是如何實現的,只要會使用就行了,相對于C語言中的字符串,它更易用更方便。
注意:
1.OC中的字符串常量必須加一個@前綴,寫在雙引號外面。比如
@"zhoujianfeng"
2.OC的字符串常量使用NSString類型的指針變量來保存地址。比如
NSString *str = @"zhoujianfeng";
3.NSString類型的指針變量只能保存OC字符串地址。不能
NSString *str = "zhoujianfeng";//這種是錯誤的
4.使用%@格式控制符輸出NSString類型的字符串。比如
NSLog(@"%@",str);
四、OC中的一些玩意
NS前綴:為了區分這些東西的前身是NeXTStep,就為他們加了一個前綴NS。
@符號:將C語言的字符串轉換為OC的字符串,"zhou" 加了就成 @"zhou"。OC中新增的關鍵字絕大部分都是以@開頭。
OC支持C中的所有數據類型,并且在此基礎之上新增了一些數據類型。比如BOOL類型、Boolean類型、id類型、class、SEL類型、nil、block代碼塊等等。
五、面向過程與面向對象
面向過程:
遇到一個需求的時候,實現這個需求的過程、步驟都是自己親自去做。(執行者)與底層交互效率很高。
面向對象:
遇到一個需求的時候,實現這個需求的過程、步驟自己不做,而是去找一個專門做這個事情的人來做。(指揮者)后期程序的維護和擴展非常的方便,如果功能發生變化,我們只需要換一個人就行了。
六、類的聲明和實現
015-OC基礎語法-OC筆記
對象是生活中看得見、摸得著、具體存在的個體。而類則是對一群具有相同特征、行為的事物的統稱。
類的三要素:
類名:這類事物叫做什么名字
成員變量:這類事物具有相同的特征
方法:這類事物具有相同的行為
類的聲明語法:
@interface 類名 : 父類名
{
//實例變量
}
//方法的聲明
@end
類的實現語法:
@implementation 類名
//方法的實現
@end
注意:
1.類的聲明一定要在類的實現前面,并且是直接寫在源文件中,不能寫到main函數中。
2.類名的每一個單詞的首字母大寫,類名和NSObject之間是:號,實例變量名必須要以下劃線開頭。
3.類分為類的聲明和類的實現兩部分,缺一不可,并且都以@end結尾。
簡單案例:
#import
//類的聲明
@interface Person : NSObject
{
@public
NSString *_name;
int _age;
float _height;
float _weight;
}
@end
//類的實現
@implementation Person
@end
//main主函數
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [Person new];
//因為這些實例成員的訪問權限是@public,所以可以直接訪問
person->_name = @"jack";
person->_age = 18;
person->_height = 1.8;
person->_weight = 60;
//輸出人的各種信息
NSLog(@"name = %@,age = %i,height = %.2f,weight = %.2f",person->_name,person->_age,person->_height,person->_weight);
}
return 0;
}
七、類的方法
我們都知道類是一群具有相同的屬性、相同的行為的事物統稱,在這里說的行為就是類的方法(有些屌絲也叫函數)。和C語言的函數類似,但語法截然不同。
方法的聲明
位置:寫在類聲明里的屬性大括號后面,@end前面
無參數語法:- (返回值類型)方法名;
有參數語法:- (返回值類型)方法名:(參數類型)參數名稱;
多個參數語法:- (返回值類型)方法名:(參數類型)參數名稱 方法名:(參數類型)參數名稱 方法名:(參數類型)參數名稱;
@interface Person : NSObject
{
NSString *_name;
}
//聲明無參數的方法
- (void)sayHi;
//聲明一個參數的方法
- (void)eatWith:(NSString *)foodName;
//聲明多個參數的方法
- (int)getSumWithNum1:(int)num1 andNum2:(int)num2;
@end
方法的實現
位置:寫在類實現里@end前面
無參數語法:- (返回值類型)方法名{方法體}
有參數語法:- (返回值類型)方法名:(參數類型)參數名稱{方法體}
多個參數語法:- (返回值類型)方法名:(參數類型)參數名稱 方法名:(參數類型)參數名稱 方法名:(參數類型)參數名稱{方法體}
@implementation Person
//實現無參數的方法
- (void)sayHi{
//在方法的實現中,無需創建對象可以直接訪問類的成員變量
NSLog(@"我的名字是:%@",_name);
}
//實現一個參數的方法
- (void)eatWith:(NSString *)foodName{
NSLog(@"吃%@",eatFood);
}
//實現多個參數的方法
- (int)getSumWithNum1:(int)num1 andNum2:(int)num2{
return num1 + num2;
}
@end
方法的調用
無參語法:[對象名 方法名];
有參語法:[對象名 方法名:實參];
多個參數語法:[對象名 方法名:實參 方法名:實參 方法名:實參];
//實例化一個對象
Person *person = [Person new];
//給對象的_name屬性賦值
person -> _name = @"好玩";
//調用無參數的方法。有些屌絲也稱:向person對象發送了一條sayHi消息
[person sayHi];
//調用一個參數的方法
[person eatWith:@"包子"];
//調用多個參數的方法
int result = [person getSumWithNum1:10 andNum2:20];
NSLog(@"result = %i",result);
注意:
1.有參方法的方法名也包括:,每個冒號后面就是一個參數,有多少個參數就有多少個冒號。
2.在主函數調用方法必須要通過實例化一個對象來調用(后面還會學類方法,先不考慮)。
3.多個參數的方法,方法名命名要規范。建議使用with和and來拼接方法名,要讓調用者知道這個參數有何作用,一目了然。
4.同一個類可以創建N多個對象,對象與對象互不影響(一個對象實例變量的值對另一個對象毫無關系)。
5.哪個對象調用的方法,方法中的成員變量就是訪問那個對象的成員變量的值。
6.如果成員變量的類型是基本類型,默認值是0,是指針類型就默認值是nil。