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