1、Objective-C 定義:
OC是以SmallTalk爲基礎,建立在C語言之上,是C語言的超集。
2、使用:
2007年蘋果公司發佈了OC 2.0,並在iPhone上使用OC進行開發。
3、編譯環境:
Xcode
4、框架:
OC編程中主要用到的框架是Cocoa,它是MacOS X中五大API之一,它由兩個不同的框架組成FoundationKit 和ApplicationKit。
5、優點:
類別、扮演(Posing)、動態類型、指針計算、彈性信息傳遞、不是一個過度複雜的c衍生語言、可通過Objective-c++與c++結合。
6、缺點:
沒有命名空間、沒有操作符重載、不像c++那樣複雜;
7、文件:
包括頭文件源文件;
.h頭文件:頭文件包涵類的定義、類型、方法以及常量的聲明。.m源文件:這個典型的擴展名用來定義源文件,可以同時包含C和Objective-C的代碼。
注:如果要加入c++的語法,需要用到.mm。
8、引用:
#import Foundation.h注:每個框架有一個主的頭文件,只要包含了這個文件,框架中的所有特性都可以被使用。
9、@:
@符號是OC在C基礎上新加的特性之一。9.1:代碼中@"aaaaaaaa":表示引用的字符串應該作爲Cocoa的NSString元素來處理。
9.2:@interface,@implement等則是對於C的擴展,是OC面向對象特性的體現。
10、NSLog()與printf():
NSLog()提供了一些特性,如時間戳,日期戳和自動加換行符等;printf() 則是C的語法什麼也沒有;
11、關於NS,UI:
前綴函數來自Cocoa而不是其他工具包。12、BOOL與bool:
OC中的BOOL:YES(1),NO(0)C中的bool:true(!0),false(0)
13、id:
OC新加的一個數據類型,它是一般的對象類型,能夠存儲任何類型的方法。
14、nil與NULL
兩者是等價的,OC中的nil 的定義: #define nil NULL15、類:
在OC中定義一個類需要有兩個部分:接口和實現。類的定義從@interface開始到@end結束。
接口文件包含了類的聲明,定義了實例變量和方法。
實現文件包含了具體的函數的實現代碼。
16、方法:
一個方法定義包含了方法類型,返回類型,一個或者多個關鍵詞,參數類型和參數名。在OC中,調用一個方法相當於傳遞一個消息,這裏的消息指的是方法名和參數。
在OC中一個類中的方法有兩種類型:實例方法,類方法。
實例方法前用(-)號表明,類方法用(+)表明;
- (void)setName:(NSString *)name setAge:(NSInteger)age;
消息調用的方式是使用方括號;
[[Person alloc] init];
消息傳遞允許嵌套;17、屬性:
通過property標識符來替代getter和setter方法;
使用方法:在類接口文件中用@property標識符,後面跟着變量的屬性,
包括 copy, retain, assign ,readonly,readwrite,nonatomic,然後是變量名。
同時在實現文件中用@synthesize標識符來取代getter和setter方法。
屬性的另一個好處就是,可以使用點(.)語法來訪問,點語法均是調用了getter和setter方法;
assign:簡單賦值,不更改索引計數,
使用assign: 對基礎數據類型 (NSInteger)和C數據類型(int, float, double, char,等)
retain,是說明該屬性在賦值的時候,先release之前的值,然後再賦新值給屬性,引用再加1。
copy:指定應該使用對象的副本(深度複製),前一個值發送一條release消息,
沒有增加引用計數,是分配一塊新的內存來放置它。
copy是創建一個索引計數爲1的對象,然後釋放舊對象,retain是創建一個指針,引用對象計數加1。
readonly:將只生成getter方法而不生成setter方法(getter方法沒有get前綴)。
readwrite:默認屬性,將生成不帶額外參數的getter和setter方法(setter方法只有一個參數)。
atomic:對於對象的默認屬性,就是setter/getter生成的方法是一個原子操作。
如果有多個線程同時調用setter的話,不會出現某一個線程執行setter全部語句之前,另一個線程開始執行setter的情況,
相關於方法頭尾加了鎖一樣。
nonatomic,非原子性訪問,不加同步,多線程併發訪問會提高性能。
先釋放原先變量,再將新變量retain然後賦值;
注意,如果不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。
18、繼承:
冒號後的標識符是需要繼承的類。
注:OC不支持多繼承,要注意的是OC只支持單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現;
注:OC中任何一個類都是繼承NSObject;與Java中任何類都繼承Object一樣
19、super:
OC提供重寫方法,並且仍然調用超類的實現方式。
當需要超類實現自身的功能,同時在前面或後面執行某些額外的工作時,爲了調用繼承方法的實現,需要使用super作爲方法調用的目標。
向super發送消息時,實際上是在請求OC向該類的超類發送消息。
注:如果超類中沒在定義該消息,OC將按照通常的方式在繼承鏈中繼續查找對應的消息。
20、對象初始化:
兩種方法:
1、[類名new]
2、[[類名 alloc]init]。這兩種方法是等價的,但是少有用到第一種;
NSString *name=[[NSString alloc]init];
[[類名alloc]init]有兩個動作:alloc是分配動作,是從操作系統獲得一塊內存並將其指定爲存放對象的實例變量的位置,
同時,alloc方法還將這塊內存區域全部初始化爲0。與分配動作對應的是初始化init;
21、init方法:
在alloc 分配內存後,可以手寫init初始化方法;相當於Java中的構造函數;可以重寫由父類繼承的init方法,也可以添加自己的init 參數方法;
注:重寫父類的init方法時可以使用:
self= [super init];
22、協議 @protocol:
協議即java 中的接口:
1、申明:
@protocol ADelegate
- (void)methodA;
- (void)methodB;
@end
2、使用:
@interface ClassB <ADelegate> {
}
@end
注:@optional和@required;可選的實現方法,和必須的實現方法;
23、委託delegate:
編寫委託對象並將其提供給其他一些對象,通過實現特定的方法,可以控制Cocoa中的對象的行爲。
適合於回調機制:即A調用B時,設置B的delegate爲A,A調用B的方法時既可以在B中回調A的方法;
24、類別:
類別允許你在現有的類中加入新功能,這些類可以是框架中的類,並且不需要擴充它。
申明與實現:
@interface NSString (NumberConvenience)
-(NSNumber *)lengthAsNumber;
@end
@implementation NSString (NumberConvenience)
-(NSNumber*) lengthAsNumber
{
unsigned intlength = [self length];
return ([NSNumber numberWithUnsignedInt: length]);
}
@end
用於拓展系統類的功能;上例中就是用於拓展NSString的功能;
注:
類別無法向類中添加新的實例變量,類別沒有位置容納實例變量。
命名時注意命名衝突,當有衝突時類別具有更高的優先級。
25、選擇器@selector():
選擇器只是一個方法名稱,它以OC運行時使用的特殊方式編碼,以快速執行查詢。
@selector(btnClick:)
選擇器十分靈活:可以被傳遞,可以作爲方法的參數使用,甚至可以作爲實例變量存儲。
26、Posing :“冒充”:
Posing存在的目的在於子類可以冒充父類,使得後續的代碼無需把父類修改爲子類,
就可以很方便的讓父類表現成子類的行爲,從而實現非常方便的冒充;
<span style="font-size:14px;">[FunctionChild poseAsClass [Function class]]; </span>
此時FunctionChild 便可以冒充Function 在Function的對象實例中使用的是 FunctionChild 的方法;
27、動態識別:
-(BOOL)isKindOfClass:classObj
//是否是其子孫或一員
-(BOOL)isMemberOfClass:classObj
//是否是其一員
-(BOOL)respondsToSelector:selector
//是否有這種方法
+(BOOL)instancesRespondToSelector:selector
//類的對象是否有這種方法
-(id)performSelector:selector
//執行對象的方法