柚子快報邀請碼778899分享:Objective-C學習
通過.m擴展名表示文件使用的是Objective-C代碼,應由Objective-C編譯器處理
#import語句
#import語句來引用頭文件,保證頭文件只被包含一次,無論這條命令在該文件中出現(xiàn)了多少次
(C語言中:#ifdef來避免一個文件包含另一個文件而后者又包含前者;objective-c用#import實現(xiàn))
框架
框架是一種把頭文件、庫、圖片、聲音等內(nèi)容聚集在一個獨立單元中的集合體。
蘋果公司框架集:Cocoa(包括Foundation和Application Kit)、Carbon、QuickTime、OpenGL
Foundation框架處理的是用戶界面之下的那些層的特性,比如數(shù)據(jù)結(jié)構(gòu)和通信機制
NSLog()和@“字符串”
作用和C中的printf()比較像,可以用print f()代替,但是NSLog()可以自動換行
NSString:@是本體
eg:NSLog(@"Hello,Objective-C!");
@意味著引號內(nèi)的字符應作為Cocoa的NSString元素來處理
NSString支持的功能:長讀、與其他字符串比較、將自身換成整型值或者浮點值
布爾類型
?C:true false
Objective-C:YES NO ? ? ? ?占8位
實際上是一個signed char類型 通過#define將YES定義為1 NO為0
如果是一個更大的整型值賦給了BOOL 那么取低8位
面向?qū)ο?/p>
OOP:面向?qū)ο缶幊?/p>
對象:一種包含值和指向其類的隱藏指針的結(jié)構(gòu)體
實例:對象的另一種稱呼
“間接”:編寫一段代碼來完成別的任務(wù)
OOP中,不再重點關(guān)注函數(shù),專注數(shù)據(jù);數(shù)據(jù)通過間接方式引用代碼,代碼可以對數(shù)據(jù)進行操作。
id:是一種 泛型,可以用來引用任何類型的對象?
[]:通知某個對象該去做什么,方括號中第一項是對象,其余部分是需要對象執(zhí)行的操作
(??發(fā)送消息/調(diào)用方法)
接口:類為對象提供的特性描述
實現(xiàn):使接口能正常工作的代碼
@interface Circle:新類Circle的接口
-:方法的聲明
- (void) setBounds: (ShapeRect) bounds;
-(void):聲明一個新方法 返回值為void
setBounds: :setBounds是方法名 ????????‘:'是說后面會出現(xiàn)參數(shù)
(ShapeRect) bounds:參數(shù)名和參數(shù)類型
如果有參數(shù)就用冒號,如果沒有就不需要
@implementation ? ? ? ?使對象能運行的代碼位于@implementation中
類名出現(xiàn)在@implementation后 結(jié)尾不需要分號 ? ? ? ?方法后也不需要
@implementation Circle
-(void) setFillCollor: (ShapeColor) c
{ fillColor = c;
}
不必按照interface的順序來,而且可以新寫 當作似有方法
接口是展示類的構(gòu)造,實現(xiàn)是實現(xiàn)接口聲明的方法
繼承
用于聲明新類的的語法:
@interface Circle: NSObject
冒號后邊的標識符是需要繼承的類
超類/父類:繼承的類
子類/孩子類:執(zhí)行繼承的類
繼承的方法調(diào)度:
先在子類中查找相應的方法 ,如果找不到,就到對象的超類中找,以此類推,在繼承鏈中尋找,如果在最頂層NSObject類中也沒找到,就會出現(xiàn)一個運行時錯誤,以及編譯時的警告信息
如何訪問實例變量:
?重寫方法:
正常:父類的方法為空,子類的方法進行定義,直接調(diào)用重寫后的方法
0super:既能重寫方法的實現(xiàn),又能調(diào)用超類中的實現(xiàn)方法
[super setFillerColor: c]
向super發(fā)消息的時候,實際上是在請求向該類的超類發(fā)送消息,如果超類中沒有定義該消息,就會繼續(xù)向繼承鏈的上一級中查找
復合
建立類之間的關(guān)系,組合多個對象,讓他們分工協(xié)作
accessor:讀取或者改變某個對象屬性的方法
getter:通過對象自身訪問對象屬性的方法
繼承和復合:
繼承是:is a
復合是:have a ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
源組織文件
.h文件:存放接口部分代碼:@interface指令、公共struct定義、enum常量、@defines、extern
.m文件:實現(xiàn)內(nèi)容:@implementation指令、全局變量的定義、私有struct? ? ? ? ? ? ?
如果擴展名是.mm:編譯器會認為是Objective-C++編寫的代碼,可以同時使用C++和Objective-C來編程
@class:前向引用
告訴編譯器:trust me? 以后自然會知道這個是什么;也可以循環(huán)引用如果在A. h 文件中使 用@class?B , 在 B . h 中 使 用@class A , 那 么 這 兩 個 類 就 可 以 互 相 引 用 了 。
引用子類的時候不能使用@class ,要用@import? ? ? ? ? ? ? ? ? ? ?
Runtime
運行時 程序在運行的時候可以改變結(jié)果(引進新函數(shù) 刪除存在的函數(shù))
runtime就是一組API
.m文件執(zhí)行clang -rewrite-objc main.m會生成.cpp文件 即編譯后的文件
屬性和對象沒有存在在實例對象里,只存在在類對象里
SEL:方法編號
IMP:函數(shù)指針,保存了方法的指針
Method:SEL,IMP,類型描述字符串
類的動態(tài)配置
消息傳遞 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
消息的發(fā)送
找到IMP
objc——msgSend:消息的接受者,消息的方法名,
消息的轉(zhuǎn)發(fā)
找不到IMP后的一系列操作
???????
?
柚子快報邀請碼778899分享:Objective-C學習
文章鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。