Objecitive-C基礎(chǔ)教程-基礎(chǔ)語法
Objective-C 是一種簡單的計算機(jī)語言婶芭,設(shè)計為可以支持真正的面向?qū)ο缶幊獭?/p>
Objective-C 通過提供類定義,方法以及屬性的語法,還有其他可以提高類的動態(tài)擴(kuò)展能力的結(jié)構(gòu)等第租,擴(kuò)展了標(biāo)準(zhǔn)的 ANSI C 語言蹄皱。類的語法和設(shè)計主要是基于 Smalltalk,最早的面向?qū)ο缶幊陶Z言之一吨娜。
如果你以前使用過其他面向?qū)ο缶幊陶Z言,那么下面的信息可以幫助你學(xué)習(xí) Objective-C 的基本語法淘钟。許多傳統(tǒng)的面向?qū)ο蟾拍罨略绶庋b,繼承以及多態(tài)米母,在 Objective-C 中都有所體現(xiàn)勾扭。這里有一些重要的不同,但是這些不同在這文章會表現(xiàn)出來铁瞒,而且如果你需要還有更多詳細(xì)的信息存在妙色。
如果你從來沒有使用任何編程語言編過程序,那么你至少需要在開始之前慧耍,對相關(guān)概念進(jìn)行一些基礎(chǔ)的了解身辨。對象的使用和對象對象架構(gòu)是 iPhone 程序設(shè)計的基礎(chǔ),理解他們?nèi)绾谓换?chuàng)建你的程序非常重要芍碧。想了解面向?qū)ο蟾拍畹幕蜕海垍⒖词褂?Objective-C 進(jìn)行面向?qū)ο缶幊獭?/p>
Objective-C:C的超集
Objective-Objective-C是C語言的嚴(yán)格超集--任何C語言程序不經(jīng)修改就可以直接通過Objective-C編譯器,在Objective-C中使用C語言代碼也是完全合法的师枣。Objective-C被描述為蓋在C語言上的薄薄一層怪瓶,因為Objective-C的原意就是在C語言主體上加入面向?qū)ο蟮奶匦浴?/p>
Objective-C代碼的文件擴(kuò)展名
擴(kuò)展名 | 內(nèi)容類型 |
---|---|
.h | 頭文件萧落。頭文件包含類践美,類型,函數(shù)和常數(shù)的聲明找岖。 |
.m | 源代碼文件陨倡。這是典型的源代碼文件擴(kuò)展名,可以包含 Objective-C 和 C 代碼许布。 |
.mm | 源代碼文件兴革。帶有這種擴(kuò)展名的源代碼文件,除了可以包含Objective-C和C代碼以外還可以包含C++代碼蜜唾。僅在你的Objective-C代碼中確實需要使用C++類或者特性的時候才用這種擴(kuò)展名杂曲。 |
當(dāng)你需要在源代碼中包含頭文件的時候,你可以使用標(biāo)準(zhǔn)的 #include 編譯選項袁余,但是 Objective-C 提供了更好的方法擎勘。#import 選項和 #include 選項完全相同,只是它可以確保相同的文件只會被包含一次颖榜。Objective-C 的例子和文檔都傾向于使用 #import棚饵,你的代碼也應(yīng)該是這樣的煤裙。
語法
Objective-C的面向?qū)ο笳Z法源于Smalltalk消息傳遞風(fēng)格。所有其他非面向?qū)ο蟮恼Z法噪漾,包括變量類型硼砰,預(yù)處理器(preprocessing),流程控制欣硼,函數(shù)聲明與調(diào)用皆與C語言完全一致题翰。但有些C語言語法合法代碼在objective-c中表達(dá)的意思不一定相同,比如某些布爾表達(dá)式分别,在C語言中返回值為true遍愿,但在Objective-C若與yes直接相比較,函數(shù)將會出錯耘斩,因為在Objective-C中yes的值只表示為1沼填。
第一個 Objective-C 程序,基于Xcode :
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
NSLog(@"Hello World!");
}
return 0;
}
1.什么是對象括授?
對象是現(xiàn)實生活中的1個具體存在坞笙。看得見荚虚、摸得著薛夜,拿過來直接可以使用。
2.什么是類版述?
類是對一群具有相同特征或者行為事物的1個統(tǒng)稱梯澜,抽象的。不能夠直接使用渴析。
案例:
食物. -->類
水果. -->類
桌子上的那一個水果. -->對象交通工具. -->類
汽車. -->類
公司門口的那一輛奔馳. -->對象
3.類和對象之間的關(guān)系
- 類是模板晚伙,類的對象是根據(jù)這個模板創(chuàng)建出來的。
- 類模板中有什么俭茧,對象中就有什么咆疗。
4.如何設(shè)計類
類的作用:
- 用來描述一群具有相同特征和行為的事物
設(shè)計類的三要素:
1.類的名字,你要描述這類事物的名字母债。
2.這類事物具有的相同的特征午磁,這類事物擁有什么。
3.這類事物具有的共同的行為毡们,這類事物會做什么迅皇。
5.如何找到類
- 名詞提煉法:分析整個業(yè)務(wù)流程,分析出現(xiàn)了哪些名詞衙熔,這些名詞就是你要找的類登颓。
類的定義
問題:請問是先有類還是先有對象?
從現(xiàn)實的角度:一定先有對象再有類青责。
從代碼的角度:一定先有類再有對象挺据。
-
如何定義類
1.類的三要素取具。
2.定義類的語法。a.位置:直接寫在源文件之中扁耐,不要寫在main函數(shù)之中暇检。
b.類的定義:
->類的聲明:
@interface 類名:NSObject
{
這類事物具有的共同特征。將它們定義為變量婉称。
}
功能就是一個方法块仆。此處寫方法的聲明。
@end
->類的實現(xiàn):
@implementation 類名
此處寫方法的實現(xiàn)王暗。
@end
#import<Foundation/Foundation.h>
@interface Preson : NSObject
{
NSString *_name;
int _age;
float _height;
}
@end
@implementation Preson
@end
int mian(int argc, const char * argv[])
{
return 0;
}
注意:
- 類必須要有聲明和實現(xiàn)悔据;
- 類名用描述的事物名稱命名,類名單詞首字母必須大寫俗壹;
- NSObject
- 用來表示這類事物的共同的特征的變量必須要定義在@interface的大括號之中科汗;
- 定義在大括號之中用來表示這類事物的共同的特征的變量叫做屬性、成員變量绷雏、實例變量头滔、字段;
- 為類定義屬性時涎显,屬性名必須以_開頭坤检。
- 語法是固定的:
@interface 類名:NSOnject
{
這類事物具有的共同的特征定義為變量;
數(shù)據(jù)類型 變量名1期吓;
數(shù)據(jù)類型 變量名2早歇;
......
}
@end
@implementation 類名
@end
6.如何創(chuàng)建類的對象
語法:
類名 *對象名 = [類名 new];
Preson *p1 = [Preson new];
根據(jù)Person這個類的模板,創(chuàng)建了1個對象的名字叫p1.
p1對象的特點:1讨勤、可以直接使用箭跳;
2、類中定義的東西悬襟,這個對象中也有衅码,不會多也不會少拯刁。
7.如何使用對象
-
如何訪問對象中的屬性
1.默認(rèn)情況下脊岳,對象的屬性是不允許被外界直接訪問的;
2.如果允許對象的屬性可以被外界訪問垛玻,那么就在聲明屬性的時候加一個@public關(guān)鍵字割捅。
-
訪問對象的屬性的方式
對象名 -> 屬性名 = 值; // 為對象中的屬性賦值 對象名 -> 屬性名; // 取出屬性值 (一般使用這一種取值方式) (*對象名).屬性名; // 取出屬性值```
案例
寫一個學(xué)生類帚桩, 屬性:姓名 年齡 語文成績 數(shù)學(xué)成績 英語成績
#import <Foundation/Foundation.h>
@interface Student : NSObject // 創(chuàng)建學(xué)生類
{
@public
NSString *_name;
int _age;
int _Chinese;
int _Math;
int _English;
}
@end
@implementation Student
@end
int main(int argc, const char * argv[])
{
Student *s1 = [Student new]; //創(chuàng)建對象
s1->_name = @"Barry"; // 給對象賦值
s1->_age = 18;
s1->_Math = 100;
s1->_English = 98;
s1->_Chinese = 60 ;
NSLog(@"s1對象的姓名是%@,年齡是%d,數(shù)學(xué)成績亿驾、英語成績、語文成績分別是:%d,%d,%d", //輸出定義的屬性值账嚎;
s1->_name,
s1->_age,
s1->_Math,
s1->_English,
s1->_Chinese);
}
8.方法的聲明實現(xiàn)調(diào)用
1.類的聲明和實現(xiàn)
->類的聲明 :
@interface 類名:NSObject
{
屬性:屬性表示類的特征莫瞬。
}
方法的聲明儡蔓,方法表示類的功能。
@end
->類的實現(xiàn):
@implementation 類名
方法的實現(xiàn)疼邀。
@end
2.一類事物不僅具有相同的特征喂江,還具有相同的行為。
行為就是一個功能旁振,C語言中使用函數(shù)來表示一個功能获询;
OC的類具有行為,我們使用方法來表示..
方法和函數(shù)都表示一個功能拐袜。
3.無參數(shù)的方法吉嚣。
-
聲明
a.位置:在
@interface
的大括弧外面。b.語法:
-(返回值類型)方法名稱;
**方法頭中的數(shù)據(jù)類型一定要用小括號括起來蹬铺!**
-
實現(xiàn)
a.位置:在
@implementation
之中實現(xiàn)尝哆;b.語法:將方法的聲明拷貝到
@implementation
之中,去掉分號甜攀,加上大括號{}
;
-
調(diào)用
a.方法是無法直接調(diào)用较解,因為類是不能直接使用的,必須要先創(chuàng)建對象赴邻,那么這個對象中就有類中的屬性和方法了印衔。
b.調(diào)用對象的方法:
[對象名 方法名];
案例
#import <Foundation/Foundation.h>
@interface Porson : NSObject
{
NSString *_name;
int _age;
}
-(void)Run;
@end
@implementation Porson
-(void)Run{
NSLog(@"This is Test!");
}
@end
int main(int argc, const char * argv[])
{
Porson *p1 = [Porson new];
[p1 Run];
}
4.有一個參數(shù)的方法
-
聲明
a.位置:在
@interface
的大括弧外面。b.語法:
-(返回值類型)方法名稱:(參數(shù)類型)形參名稱姥敛; 例:-(void)eat:(NSString *)foodName;
**方法頭中的數(shù)據(jù)類型一定要用小括號括起來奸焙!**
-
實現(xiàn)
a.位置:在
@implementation
之中實現(xiàn);b.語法:將方法的聲明拷貝到
@implementation
之中彤敛,去掉分號与帆,加上大括號{}
將方法實現(xiàn)的代碼寫在大括號之中;
-
調(diào)用
a.方法是無法直接調(diào)用,因為類是不能直接使用的墨榄,必須要先創(chuàng)建對象周霉,那么這個對象中就有類中的屬性和方法了碴里。
b.調(diào)用的語法:
[對象名 方法名:實參];
案例
#import <Foundation/Foundation.h>
@interface Porson : NSObject
{
NSString *_name;
int _age;
}
-(void)eat:(NSString *)foodName;
@end
@implementation Porson
-(void)eat:(NSString *)foodName{
NSLog(@"主人給我的%@真好吃!",foodName);
}
@end
int main(int argc, const char * argv[])
{
Porson *p1 = [Porson new];
[p1 eat:@"紅燒肉"];
}
5.帶多個參數(shù)的方法
-
聲明
a.位置:在
@interface
的大括弧外面。b.語法:
-(返回值類型)方法名稱:(參數(shù)類型)形參名稱1 方法名稱:(參數(shù)類型)形參名稱2 :(參數(shù)類型)形參名稱3孵睬;
例:-(int)sum:(int)num1 :(int)num2 :(int)num3;
**方法頭中的數(shù)據(jù)類型一定要用小括號括起來采记!**
-
實現(xiàn)
a.位置:在
@implementation
之中實現(xiàn)够吩;b.語法:將方法的聲明拷貝到
@implementation
之中战授,去掉分號,加上大括號{}
將方法實現(xiàn)的代碼寫在大括號之中;
-
調(diào)用
a.方法是無法直接調(diào)用背稼,因為類是不能直接使用的贰军,必須要先創(chuàng)建對象,那么這個對象中就有類中的屬性和方法了蟹肘。
b.調(diào)用的語法:
[對象名 方法名:實參1 :實參2 :實參3];
案例
#import <Foundation/Foundation.h>
@interface Porson : NSObject
{
NSString *_name;
int _age;
}
-(int)sum:(int)num1 :(int)num2 :(int)num3;
@end
@implementation Porson
-(int)sum:(int)num1 :(int)num2 :(int)num3{
int num4 = num1 + num2 + num3;
return num4;
}
@end
int main(int argc, const char * argv[])
{
Porson *p1 = [Porson new];
int sum = [p1 sum:10 :10 :25];
NSLog(@"num4 = %d",sum);
}
帶參數(shù)的方法聲明規(guī)范
1.如果方法只有一個參數(shù)
要求最好這個方法的名字叫做
xxxWith:
例:-(void)eatWith:(NSString *)foodName; //調(diào)用方法時词疼,增強(qiáng)代碼的完整可讀性
2.如果方法有多個參數(shù)
要求最好這個方法的名字叫做
xxxWith:(參數(shù)類型)參數(shù)名稱 and:(參數(shù)類型)參數(shù)名稱 and:(參數(shù)類型)參數(shù)名稱 and:
例1: -(void)sumWith:(int)num1 and:(int)num2 and:(int)num3;
例2: -(void)sumWithNum1:(int)Num1 andNum2:(int)Num2 andNum3:(int)Num3;
注意:
- 同一個類可以創(chuàng)建無數(shù)個對象俯树;
- 同一個類的多個對象之間毫無關(guān)系,雖然它們擁有相同類型的屬性和方法贰盗,屬性的值是不會相互影響的聘萨;
- 在方法實現(xiàn)當(dāng)中,可以直接訪問屬性童太;此方法是通過哪一個對象來調(diào)用的米辐,那么方法中的直接訪問的屬性就是哪個對象的
案例
寫一個Student類, 屬性: 體重;
方法1: 跑步: 每跑一次步书释,體重-0.5;
方法2: 吃飯: 每吃一次飯翘贮,體重+0.7;
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
@public
NSString *_name;
float _weight;
}
- (void)Run;
- (void)Eat;
@end
@implementation Student
- (void)Run{
NSLog(@"跑步,每跑一次,%@的體重就輕了爆惧!",_name);
_Weight -= 0.5f ;
NSLog(@"跑完了狸页,%@的體重是%.2f!",_name,_weight);
}
- (void)Eat{
NSLog(@"吃東西,每吃一次扯再,%@的體重就增長了芍耘!",_name);
_weight += 0.7f ;
NSLog(@"吃完了,%@的體重是%.2f",_name,_weight);
}
@end
int main(int argc, const char * argv[])
{
Student *p1 = [Student new];
p1->_name = @"Barry";
p1->_weight = 99.9f ;
[p1 Run];
[p1 Eat];
[p1 Run];
[p1 Eat];
}
9.作業(yè)
設(shè)計一個“Student”類
1.屬性姓名
生日
年齡
身高(單位是m)
體重(單位是kg)
性別
C語言成績
OC成績
IOS成績
2.行為
跑步:每跑一次熄阻,身高增加1cm斋竞,體重減少0.5kg,輸出跑完后的體重秃殉;
吃飯:每吃一次坝初,身高增加1cm,體重增加0.5kg钾军,輸出吃完后的體重鳄袍;
學(xué)習(xí):每學(xué)習(xí)一次,3科成績各增加1分吏恭,輸出學(xué)習(xí)完后的3科成績拗小。
計算總分:算出3科成績的總分并打印樱哼;
計算平均分:算出3科成績的平均分并打印哀九。
總結(jié)
【學(xué)習(xí)筆記】(一)是對Objective-C的簡要介紹,是本人根據(jù)網(wǎng)絡(luò)資源的學(xué)習(xí),自我編輯的這份筆記唇礁,這也算是自己向Ios開發(fā)之路的第一步吧勾栗!