- 快速枚舉
Objective-c 2.0中引入了快速枚舉,它提供了一種簡單而優雅的方式來枚舉集合中的元素,比如數組和集合。它增加了一個for- loop循環,使用簡潔的for/in語法來迭代集合
NSArray *colors = [NNArray arrayWithObjects:
@"Black",@"Silver",@"Gray",nil]
for(NNString *colors in colors)
{
Printf("Consider buying a %s car", [color TUT8String]);
}
二、創建單例UIApplicartion 和UIDevice類支持訪問當前正在運行的應用程序和它運行所基於的設備硬件的相關信息。爲此他們提供了單例,即當前進程中一個類的單一實例。
例如,[UIApplication SharedApplication]返回一個單例,可以報告它使用的委託的相關信息。
構建一個單例所需要的代碼量極少,只需要在類實現中定義一個靜態餓共享實例,然後添加一個指向該實例的類方法。
@implementation ViewIndexer
static ViewIndexer *sharedInstance = nil;
+(ViewIndexer * ) sharedInstance{
if(!sharedInstance)
sharedInstance =[[self alloc] init];
return sharedInstance;
}
//Class behavior defined here
@end
要使用這個單例,調用[ViewIndexer sharedInstance]. 這將返回共享對象,並允許訪問單例提供的任何行爲。通過覆蓋allocWithZone :方法可以防止任何類創建第二個實例。
+ (id) allocWithZone : (NSZone *) zone
{
@synchronized(self){
if (sharedInstance == nil)
{
sharedInstance = [super allocWithZone:zone];
return sharedInstance;
}}
return nil;
}
三、類別
代碼清單: 爲UIDevice 類構建一個Orientation 類別
@interface UIDevice (Orientation)
@property (nonatomic, readonly) BOOL isLandscape;
@end
@implementation UIDevice (Orientation)
- (BOOL) isLandscape
{
return (self.orientation == UIDeviceOrientationLandscapeLeft) ||
(self.orientation == UIDeviceOrientationLandscapeRight);
}
@end
三、Foundation 類
1、字符串
NNString *myString = @"A string constant";
NNString *myString = [ NNString stringWithFormat :@"The number is %d",5];
NSLog = ( @"%@", [myString stringByAppendingString:@"22"]);
附加格式化提供更大的便利:
NSLog = ( @"%@", [myString stringByAppendingString:@"%d",22]);
長度與索引字符
NSLog(@"%d",myString.length);
printf("%c",[myString characterAtIndex:2]); //打印數組號爲2的字符 即 e
2、使用日期
下面的代碼說明了如何使用當前時間創建一個新日期對象,以及如何使用一個時間間隔來表示未來(或過去的某一時間)
//current time
NSDate *date =[NSDate date];
//time 10 seconds from now
date= [NSDate dateWithTimeIntervalSinceNow: 10.0f];
格式化日期:
NNDateFormatter *formatter =[[NNDateFormatter alloc] init];
[formatter autorelease];
formatter.dateFormat = @"YYYY-MM-dd HH:mm;ss";
NNString *timestamp = [formatter stringFormDate:[NSDate date]];
NSLog(@“ %@”,timestamp);
四、集合
iPhone 主要使用三類集合: 數組、字典、和集
1、構建和訪問數組
使用便利方法arrayWithObjects:創建數組,它返回一個自動釋放的數組,調用次方法時,列出要添加給數組的所以方法,並使用空值完成列表。
NSArray *array = [ NSArray arrayWithObjects: @"One",@"Two", @"Three",nil];
可變數組是可編輯的。NSArray 的可變形式是NSMutableArray 。藉助可變數組,可隨意增加和刪除對象。
NSMutableArray *marray = [NSMutableArray arrayWithArray : array];
[marray addObject:@"Four"];
[marray removeObjectIndex:2];
NSLog(@"%@",marray);
2、檢查數組
可測試一個數組是否包含某個對象,並恢復指定對象的索引。
如: if([marray containsObject:@"Four"])
NSLog(@"The index is %d", [marray indexofObject:@"Four"]); //如果數組中包含“Four”這個對象,打印索引位置。
接口是對象的類應該提供特性的描述。接口不提供實現的細節
實現是是接口正常工作的代碼。
在Objective-C 中只要看到@ 符號,都可以把它看成C語言的擴展@interface Circle告訴編譯器:“這是爲名爲Circle的新類定義的接口”;
@interface 用於定義類的公共接口。通常,接口被稱做API“application programming interface” 中3個首字母的縮寫。使對象真正起作用的代碼位於 @implementtation部分中。
3、Objective -C 不支持多繼承,但是可以通過其他特性獲取多繼承的有點,例如分類和協議。
改變方法的實現時,需要重寫 (Override),代碼運行時,Objective-C 確保調用相應類的重寫方法的實現。
記住每個方法調用都獲得了一個名爲self 的隱藏參數,他是一個指向接收消息的對象的指針。方法使用self 參數查找它們要使用的實例變量。
Objective-C 提供某種方式來重寫方法,並且任然調用超類的實現方式。當需要超類實現自身的功能,同時在前面或後面執行某些額外的工作時,這種機制非常有用。爲了調用繼承方法的實現,需要使用super 作爲方法調用的目標。
4、複合
編程中的複合就好像音樂中的作曲一樣:將多個組建組合在一起配合使用,從而得到完整的作品。
在Objective -C中,複合是通過包含作爲實例變量的對象指針實現的。嚴格來講,只有對象間的組合才能叫做複合。
@interface Car : NSObject
{
Engine * engine;
Tire *tires[4];
}
- (void) print;
@end //Car
實現
@implementation Car
- (id) init
{
if(self = [super init]){
//這一句話是什麼意思呢?若要超類可以完成所需的一次性初始化,需要調用【super init】,init 方法返回的值(id 型數據,即範型對象指針)描述了被初始話的對象。將【super init】的結果賦給self 是Objective - C的標準慣例,這麼做是防止超類在初始化的過程中返回的對象不同於原先創建的對象。
engine = [Engine new ];
tires[0] = [Tire new];
tires[1] = [Tire new];
tires[2] = [Tire new];
tires[3] = [Tire new];
}
return (self);
} //init
- (void) print{
NSLog(@"%@",engine);
NSLog(@"%@",tires[0]);
NSLog(@"%@",tires[1]);
NSLog(@"%@",tires[2]);
NSLog(@"%@",tires[3]);
@end //Car
主函數 main()
且來看看Objective- C的主函數
int main(int args, const char *argv[]){
Car *car; //聲明
car = [Car new]; //創建
[car print]; //打印自身信息
return(0); //退出程序
} //main
防禦式編程 一般寫在setter 函數中。
複合是OOP 的基本概念,我們用這種技巧來創建引用其他對象的對象
存取方法和複合是密不可分的,我們通常都會爲複合的對象編寫存取方法。
兩種類型的存取方法:setter方法和 getter 方法,前者告訴對象將屬性改爲什麼,後者要求對象提供屬性的值。
---------------------------------------------------------------------------------------------------
@class 創建了一個前向引用。就是在告訴編譯器:“相信我,你以後會知道這個到底是什麼,但是現在,照個面就可以了”;
如果有循環依賴關係,@class 也很有用,即A類使用B類,B類也使用A類。如果試圖通過#import 語句讓這兩個類互相引用,那麼最後就會出現編譯器錯誤。但是在A.h 中使用 @class ,在B.h 中使用@class ,那麼這兩個類就可以互相引用了。