Objective-C 簡(jiǎn)稱OC /Obj-c Objective 是面向?qū)ο蟮?,OC是在C語(yǔ)言的基礎(chǔ)上添加了一些新的面向?qū)ο蟮恼Z(yǔ)法,比較繁瑣的語(yǔ)法封裝的更為簡(jiǎn)單,所以在學(xué)習(xí)Objective-C之前大家必須去學(xué)習(xí)C語(yǔ)言一些基本的語(yǔ)法之類,這里我也寫了C語(yǔ)言的學(xué)習(xí)博客,去學(xué)習(xí)C語(yǔ)言,大家可以參考一下。 所以O(shè)C它是完全兼容C語(yǔ)言的,我們可以在任何的OC語(yǔ)言中寫任意的C代碼。
學(xué)習(xí)的知識(shí)點(diǎn): 1.main函數(shù)仍然是程序的出入口, 2.使用NSLog()函數(shù)進(jìn)行打印輸出, 3.@”“表示一個(gè)字符串
在學(xué)習(xí)了C語(yǔ)言之后,我們知道如果想要 引用系統(tǒng)中的頭文件使用:#include<XXXX> 引用自己定義的頭文件使用:#include “xxxx” 而在OC中使用的是#import,那么引入#imPRot有什么好處呢?
首先我們分別創(chuàng)建一個(gè)a.c和b.c文件并分別自動(dòng)生成一個(gè)a.h和b.h的頭文件: a.h中添加#include “b.h”
#ifndef a_h#define a_h#include <stdio.h>#include "b.h"#endif /* a_h */b.h中添加#include “a.h”
#ifndef b_h#define b_h#include <stdio.h>#include "a.h"#endif /* b_h */這種現(xiàn)象叫做重復(fù)包含,然后:
發(fā)現(xiàn)我們的include會(huì)報(bào)錯(cuò),然后我們改成import:
會(huì)發(fā)現(xiàn)我們的報(bào)錯(cuò)就消失了,這到底是為了什么呢? 首先我們?cè)赼.h與b.h中都是:
ifndef:表示如果不存在就引入b.h文件,存在就啥都不干 define:表示默認(rèn)引入b.h文件 endif:結(jié)束語(yǔ),否則不引入b.h
而我們的import: #import指令是#include指令的增強(qiáng)版,能實(shí)現(xiàn)include的功能
.
列表內(nèi)容#include指令單獨(dú)使用,可能會(huì)造成重復(fù)包含,要防止重復(fù)包含,用預(yù)編譯指令配合才能防止重復(fù)包含。#import增強(qiáng)的點(diǎn)就是單獨(dú)使用這個(gè)指令的時(shí)候,不會(huì)造成重復(fù)包含,同一個(gè)文件中,無(wú)論被#import多少次,在預(yù)編譯的時(shí)候只會(huì)包含一次。#import指令的底層會(huì)自動(dòng)判斷這個(gè)文件是否包含,沒(méi)有包含的時(shí)候才會(huì)包含#import指令包含的時(shí)候和#include一樣,也分為#import “” ,例如我們例子中的#import “a.h”文件搜索順序:先從當(dāng)前文件夾下-->編譯器的文件夾下-->系統(tǒng)文件夾-->查找失敗 #import <>,例如我們例子中的#import四、NSLog()、NSString、NS前綴介紹、@符號(hào)介紹:
1、NSLog():C語(yǔ)言中的printf中的增強(qiáng)版 作用:在控制臺(tái)打印數(shù)據(jù)
好處:打印清晰,不用輸入/n,會(huì)自動(dòng)換行
2、NSString():OC中特意設(shè)置了NSString指針去儲(chǔ)存字符串,使用NSString指針變量可以保存1個(gè)字符串?dāng)?shù)據(jù)的地址。
注意: 一、OC字符串OC字符串必須以@開(kāi)頭 二、@必須寫在”“前面 三、在OC中打印字符串使用%@ 四、 NSString只能儲(chǔ)存字符串?dāng)?shù)據(jù)地址
例如:
與C語(yǔ)言相比增加了一個(gè)@。
3、NS前綴():
前綴:在OC應(yīng)用中所有的類名都必須是全局唯一的,由于很多不同的框架會(huì)有一些相似的功能,所有在名字上也會(huì)有重復(fù)的可能,所以蘋果官方文檔規(guī)定類名需要2-3個(gè)字母作為前綴。 類前綴: 蘋果官方建議兩個(gè)字母作為前綴的類名是為官方的庫(kù)和框架準(zhǔn)備的,而對(duì)于作為第三方開(kāi)發(fā)者的我們,官方建議使用3個(gè)或者更多的字母作為前綴去命名我們的類。 NS來(lái)自于NeXTStep 的一個(gè)軟件 NeXT Software.OC中不支持命名空間,NS是為了避免命名沖突而給的前綴,看到NS前綴就是知道是Cocoa中的系統(tǒng)類的名稱
4、@符號(hào)介紹:在OC中@符號(hào)有兩種含義:
@”“:代表OC語(yǔ)言中的一個(gè)字符串,例如:@”你好世界”@直接接英文:代表OC語(yǔ)言中的一個(gè)關(guān)鍵字,例如:@interface五、在OC中調(diào)用C代碼:
#include "Show.h"void showTest(){ printf("我是C語(yǔ)言寫的,何人敢調(diào)用我啊/n");}
以上我們是在OC中直接寫C代碼,現(xiàn)在我們來(lái)看下: 創(chuàng)建一個(gè)Show.c:
Show.h:
#ifndef Show_h#define Show_h#include <stdio.h>extern void showTest();#endif /* Show_h */main.m:
我們?cè)趍ain中調(diào)用新創(chuàng)建的.c文件代碼看到也是可以調(diào)用的。
六、OC中的布爾類型:
我們知道C語(yǔ)言中是沒(méi)有布爾類型的,使用int類型去表示真假,2而OC提供了BOOL和Boolean去表示真假。
七、類的聲明和實(shí)現(xiàn)
類:.h文件為類的聲明文件,用于聲明成員變量、方法。類的聲明使用關(guān)鍵字@interface和@end
注意:.h中的方法只是做一個(gè)聲明,并不對(duì)方法進(jìn)行實(shí)現(xiàn),也就是說(shuō),只是說(shuō)明一個(gè)方法名,方法的返回值類型、方法接受的參數(shù)類型而已,并不會(huì)編寫方法內(nèi)部的代碼
.m:類的實(shí)現(xiàn)文件,用于實(shí)現(xiàn).h中聲明的方法,類的實(shí)現(xiàn)使用關(guān)鍵字@implementation和@end
方法:方法的聲明和實(shí)現(xiàn),都必須以+或者-開(kāi)頭 +表示類方法(靜態(tài)方法) -表示對(duì)象方法(動(dòng)態(tài)方法)
成員變量:成員變量作用域有3中: 1.@public 全局都可以訪問(wèn) 2.@protected 只能在類內(nèi)部和子類訪問(wèn) 3. @private 只能在類內(nèi)部訪問(wèn)
以上我們可以看到: 1、類的聲明:@interface 類名:父類類名(NSObject是所有類的父類) 2、類的實(shí)現(xiàn):@implementaion 需要實(shí)現(xiàn)的類名
八、#pragma mark指令的使用,函數(shù)與對(duì)象方法的區(qū)別,常見(jiàn)注意點(diǎn)
當(dāng)我們一個(gè)類中有大量代碼,為了容易區(qū)分我們可以使用 #pragma mark 需要備注的信息
函數(shù)與對(duì)象方法的區(qū)別: 1.函數(shù)使用的時(shí)候直接調(diào)用,對(duì)象方法需要?jiǎng)?chuàng)建對(duì)象才能調(diào)用 2.函數(shù)不能放在聲明中,對(duì)象方法的實(shí)現(xiàn)和聲明只能方法在關(guān)鍵字練 3.函數(shù)不可以訪問(wèn)對(duì)象中的成員變量 4.對(duì)象方法歸類所有
常見(jiàn)注意點(diǎn): 1.實(shí)現(xiàn)和聲明必須一一對(duì)應(yīng) 2.@implementation、@interface、@end不能嵌套包含 3.成員變量必須寫在{}里面,方法必須寫在{}的外面 4.在聲明時(shí)不能對(duì)類的成員變量初始化,請(qǐng)注意成員變量不能脫離對(duì)象而獨(dú)立存在。 5.成員變量和方法不能使用static等關(guān)鍵字修飾,主要是不要和C語(yǔ)言混淆 6.類的實(shí)現(xiàn)可以寫在main函數(shù)后面,在使用之前只要有聲明就可以
九、NSString類簡(jiǎn)單介紹及用法
1.四種創(chuàng)建字符串的方式:
#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { //1. NSString *name=@"張三"; NSLog(@"%@",name); //2. NSString *string = [NSString new]; string=@"李四"; NSLog(@"%@",string); //3. NSString *string2= [[NSString alloc] initWithFormat:name]; NSLog(@"%@",string2); //4. NSString *string3=[NSString stringWithFormat:@"圖片 xxx %02d- %02d",0x13,10]; NSLog(@"%@",string3); } return 0;}1.NSString字符串長(zhǎng)度的計(jì)算方式:
NSString *str=@"abcdefg";NSLog(@"str的長(zhǎng)度為:%ld",[str length]);//7十、類方法介紹
前面我們說(shuō)過(guò)用+修飾的代表類方法,例如: Person.h:
@interface Person : NSObject{ @public NSString *_name;}+ (void) show:(NSString *)name;- (void) showObj;@endPerson.m:
#import <Foundation/Foundation.h>#import "Person.h"@implementation Person+ (void) show:(NSString *)name{ NSLog(@"name=%@",name);}- (void) showObj{ NSLog(@"name=%@",_name);}@endmain.m:
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *person=[Person new]; person->_name=@"我是通過(guò)對(duì)象來(lái)調(diào)用"; [person showObj]; [Person show:@"我是通過(guò)類調(diào)用的"]; } return 0;}
十一、self的用法
Student.h
@interface Student : NSObject- (void) study;- (void) eat;@endStudent.m
#import <Foundation/Foundation.h>#import "Student.h"@implementation Student- (void) study{ NSLog(@"我在學(xué)習(xí)啊。。"); [self eat];}- (void) eat{ NSLog(@"我在吃啊。。");}@endmain.m
#import <Foundation/Foundation.h>#import "Student.h"int main(int argc, const char * argv[]) { @autoreleasepool { Student *s=[Student new]; [s study]; } return 0;}
十二、description與Super的使用
Worker.h
@interface Worker : NSObject{ @public NSString *_name; int _num;}- (void)setName:(NSString *)name;- (NSString *)name;- (void)setNum:(int)num;- (int)num;@endWorker.m
#import <Foundation/Foundation.h>#import "Worker.h"@implementation Worker/**- (NSString *)description{ return _name;}*/- (void)setName:(NSString *)name{ _name=name;}- (NSString *)name{ return _name;}- (void)setNum:(int)num{ _num=num;}- (int)num{ return _num;}@endmain.m
#import <Foundation/Foundation.h>#import "Worker.h"int main(int argc, const char * argv[]) { @autoreleasepool { Worker *worker=[Worker new]; worker->_name=@"張三"; NSLog(@"worker:%@",worker); } return 0;}運(yùn)行結(jié)果:
我們看到Worker.m中我們有一個(gè)description的方法,我們打開(kāi)它然后運(yùn)行:
這時(shí)候可以看到原本輸出的地址值變成了我們description 方法中的值輸出了 (NSString*) description 1.所有的類,都有description方法 2.作用:賦值NSLog輸出
二、Super應(yīng)用場(chǎng)景: 1.用在對(duì)象的方法中 調(diào)用對(duì)象父類的對(duì)象方法 2.用在類方法中 調(diào)用類的父類的類方法
十三、成員變量修飾符的介紹
成員變量修飾符: 1.@public :(公開(kāi))只要導(dǎo)入頭文件,任何位置都可以使用 2.@protected:(半公開(kāi))可以在本類和子類當(dāng)中進(jìn)行訪問(wèn)(new出來(lái)的對(duì)象是調(diào)用不到的) 3.@private:(私有)只能在本類當(dāng)中進(jìn)行訪問(wèn),子類無(wú)法進(jìn)行訪問(wèn)賦值 @private修飾的成員變量子類不能直接訪問(wèn),但是子類因?yàn)槔^承了這個(gè)@private修飾的成員變量,所以子類也不能重新定義這個(gè)成員變量。 4.@package:在同一框架內(nèi),可以直接訪問(wèn)
十四、多態(tài)的介紹
為什么父類可以訪問(wèn)子類繼承自父類的方法,但是無(wú)法訪問(wèn)子類獨(dú)有的方法? 1.編譯器編譯時(shí): 編譯器在編譯時(shí),只檢查指針變量的類型,確定該指針變量類型里面有下面調(diào)用的方法,如果有該方法,編譯器就認(rèn)為,是正確的,可以編譯通過(guò)。 2.運(yùn)行時(shí),會(huì)動(dòng)態(tài)監(jiān)測(cè)對(duì)象的真實(shí)類型,然后,調(diào)用對(duì)象自己的方法
父類指針,指向子類對(duì)象的這種形式,叫做多態(tài)。 當(dāng)父類想要訪問(wèn)子類特有的方法時(shí),強(qiáng)制類型轉(zhuǎn)換。
十五、類對(duì)象
1.類代碼存儲(chǔ)在代碼區(qū)。 2.當(dāng)程序運(yùn)行時(shí),類第一次被訪問(wèn),加載到代碼區(qū),這個(gè)加載類的過(guò)程稱為類加載 3.類一旦加載到代碼區(qū)之后,就一直不會(huì)釋放,直到程序結(jié)束的時(shí)候才會(huì)被釋放 4.任何數(shù)據(jù)存儲(chǔ)于代碼區(qū),都有數(shù)據(jù)類型,那么類的數(shù)據(jù)類型什么呢?如何獲取呢? main.m
#import <Foundation/Foundation.h>#import "Teacher.h"int main(int argc, const char * argv[]) { @autoreleasepool { Teacher *teacher=[Teacher new]; //第一種獲取類對(duì)象的方法 Class c1=[teacher class]; //第二種獲取類對(duì)象方法 Class c2=[Teacher class]; // c2= [Teacher new]; //[(Teacher*)c2 test]; [c2 show]; // c2->_num; NSLog(@"c1=%p,c2=%p",c1,c2); } return 0;}總結(jié): 1.類對(duì)象可以調(diào)用類方法 2.類對(duì)象可以創(chuàng)建出一個(gè)對(duì)象 3.不能用類對(duì)象調(diào)用方法 4.不能用類對(duì)象給成員變量賦值
十六、SEL的使用:
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *per=[Person new]; //test為對(duì)象中的方法, //如果對(duì)象per中沒(méi)有test方法就會(huì)報(bào)錯(cuò) SEL s=@selector(test); //調(diào)用方式:[對(duì)象名 performSelector:SEL的變量名] [per performSelector:s]; } return 0;}十七、點(diǎn)語(yǔ)法的使用
我們知道OC是面向?qū)ο蟮?,所以必然有三大特性:封裝,多態(tài),繼承,封裝就是將我們的屬性給封裝起來(lái)使用set和get去得到屬性 Person.h
@interface Person : NSObject{ @public NSString *_name; int _age; int _sex;}- (void)setName:(NSString*)name;- (NSString*)name;- (void)setAge:(int)age;- (int)age;- (void)setSex:(int)sex;- (int)sex;@endPerson.m
#import <Foundation/Foundation.h>#import "Person.h"@implementation Person- (void)setName:(NSString*)name{ _name=name;}- (NSString*)name{ return _name;}- (void)setAge:(int)age{ _age=age;}- (int)age{ return _age;}- (void)setSex:(int)sex{ _sex=sex;}- (int)sex{ return _sex;}@endmain.m
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p=[Person new]; p.name=@"張三"; p.age=10; p.sex=1; NSLog(@"name=%@,age=%d,sex=%d",p.name,p.age,p.sex); } return 0;}點(diǎn)語(yǔ)法的本質(zhì)就是set和get方法的調(diào)用
十八、@property、@synthesize關(guān)鍵字的使用
@property的作用:能夠自動(dòng)生成get和set方法的聲明, 定義方式:@property 成員變量類型 成員變量名(去掉下劃線) 在XCode4.4版本之前需要配合@synthesize使用
Person.h
@interface Person : NSObject{@public NSString *_name; NSString *name; int _age; int _sex;}/**- (void)setName:(NSString*)name;- (NSString*)name;- (void)setAge:(int)age;- (int)age;- (void)setSex:(int)sex;- (int)sex; */@property NSString *name;@property int age,sex;@endPerson.m
#import <Foundation/Foundation.h>#import "Person.h"@implementation Person@synthesize name,age,sex;@endmain.m:
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p=[Person new]; //這步能夠調(diào)用,證明@property生成了set和get方法的聲明 p.name=@"張三"; p.age=10; p.sex=1; //證明@synthesize生成了set和get的實(shí)現(xiàn) NSLog(@"name=%@,age=%d,sex=%d",p.name,p.age,p.sex); } return 0;}
XCode4.4之后:
Person.h
@interface Person : NSObject@property NSString *name;@property int age;@property int sex;@endPerson.m
#import <Foundation/Foundation.h>#import "Person.h"@implementation Person@endmain.m:
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p=[Person new]; //這步能夠調(diào)用,證明@property生成了set和get方法的聲明 p.name=@"張三"; p.age=10; p.sex=1; //證明@synthesize生成了set和get的實(shí)現(xiàn) NSLog(@"name=%@,age=%d,sex=%d",p.name,p.age,p.sex); } return 0;}
十九、了解動(dòng)態(tài)類型和靜態(tài)類型:
動(dòng)態(tài)類型:程序知道執(zhí)行時(shí)才能確定所屬類,多態(tài)。Animal *anl=[Cat new]; 靜態(tài)類型:將一個(gè)變量定義為特定類對(duì)象時(shí),使用的是靜態(tài)形態(tài)。Animal *anl[Animal new];
二十、id類型的使用
今天還有事,先寫到這,持續(xù)更新
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注