基本數(shù)據(jù)類型
協(xié)議protocol
在ObjC中使用@protocol定義一組方法規(guī)范,實現(xiàn)此協(xié)議的類必須實現(xiàn)對應(yīng)的方法扳缕。熟悉面向?qū)ο蟮耐贾澜涌诒旧硎菍ο笮袨槊枋龅膮f(xié)議規(guī)范。
Fundation框架
一嘱函、什么是Cocoa
Cocoa不是一種編程語言(它可以運行多種編程語言)蓉驹,它也不是一個開發(fā)工具(通過命令行我們?nèi)匀豢梢蚤_發(fā)Cocoa程序),它是創(chuàng)建Mac OS X和IOS程序的原生面向?qū)ο驛PI搂橙,為這兩者應(yīng)用提供了編程環(huán)境歉提。
我們通常稱為“Cocoa框架”,事實上Cocoa本身是一個框架的集合区转,它包含了眾多子框架苔巨,其中最重要的要數(shù)“Foundation”和“UIKit”。前者是框架的基礎(chǔ)废离,和界面無關(guān)侄泽,其中包含了大量常用的API;后者是基礎(chǔ)的UI類庫蜻韭,以后我們在IOS開發(fā)中會經(jīng)常用到悼尾。這兩個框架在系統(tǒng)中的位置如下圖:
二、NSObject
所有的Mac OS X和IOS程序都是由大量的對象構(gòu)成湘捎,而這些對象的根對象都是NSObject诀豁,NSObject就處在Foundation框架之中。通常我們會將他們分為幾類:
- 值對象
- 集合
- 操作系統(tǒng)服務(wù):文件系統(tǒng)窥妇、URL舷胜、進程通訊
- 通知
- 歸檔和序列化
- 表達式和條件判斷
- Objective-C語言服務(wù)
三、常用結(jié)構(gòu)體:NSRange活翩、NSPoint烹骨、NSSize、NSRect等
常用結(jié)構(gòu)體在Foundation框架中都有一個對應(yīng)的make
方法進行創(chuàng)建材泄,這也是我們?nèi)蘸蟊容^常用的操作;而且與之對應(yīng)的還都有一個NSStringFromXX
方法來進行字符串轉(zhuǎn)換沮焕,方便我們調(diào)試。下面提到NSSize其實就是CGSize拉宗,NSRect其實就是CGRect.
-
NSRange 表示一個范圍
- 定義:
NSRange rg = {3, 5};
- Make定義
NSRange rg = NSMakeRange(3,5);
- 第一參數(shù)是起始位置第二個參數(shù)是長度:
rg.location = 3; rg.length = 5;
- 定義:
-
NSPoint 表示Cartesian坐標系中的一個點峦树,
typedef CGPoint NSPoint;
- Make定義
NSPoint p = NSMakePoint(10, 15);
- 或者使用CG方法定義
NSPoint p2 = CGPointMake(10, 15);
- 兩個參數(shù)分別表示x軸和y軸
p1.x = 10; p1.y = 15
- Make定義
-
NSSize 表示一個二維的size,
typedef CGSize NSSize;
- 定義方法同上
NSSize s = NSMakeSize(10, 15);CGSize s2 = CGSizeMake(10, 15);
- 兩個參數(shù)width, height,
s.width = 10; s.height = 15;
-
NSRect 表示一個矩形,
typedef CGRect NSRect;
- 定義方法同上
NSRect r = NSMakeRect(10,5,100,200); NSRect r2 = CGRectMake(10,5,100,200);
- 兩個參數(shù)分別為NSPoint型的origin和NSSize型的size
四辣辫、日期:NSDate,NSTimeInterval魁巩,NSDateFormatter
Symbols
-
date 新建并返回一個新的日期
NSDate *today = [NSDate date];//獲得當(dāng)前日期 -
dateWithTimeIntervalSinceNow: 創(chuàng)建并返回一個距離當(dāng)前日期秒數(shù)的NSDate對象
+(instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;//方法
NSDate *date2=[NSDate dateWithTimeIntervalSinceNow:100];//在當(dāng)前日期的基礎(chǔ)上加上100秒 -
distantFuture 隨機獲取一個未來日期
NSDate *date3=[NSDate distantFuture];
五急灭、字符串
- 不可變字符串NSString
字符串定義
1) char *str1="C string";
2) NSString *str2=@"OC string";//ObjC字符串需要加@,并且這種方式創(chuàng)建的對象不需要自己釋放內(nèi)存
//下面的創(chuàng)建方法都應(yīng)該釋放內(nèi)存
3) NSString *str3=[[NSString alloc] init]; str3=@"OC string";
4) NSString *str4=[[NSString alloc] initWithString:@"Objective-C string"];
5) NSString *str5=[[NSString alloc] initWithFormat:@"age is %i,name is %.2f",19,1.72f];
6) NSString *str6=[[NSString alloc] initWithUTF8String:"C string"];//C語言的字符串轉(zhuǎn)換為ObjC字符串
//以上方法都有對應(yīng)靜態(tài)方法(一般以string開頭),不需要管理內(nèi)存(系統(tǒng)靜態(tài)方法一般都是自動釋放)
7) NSString *str7=[NSString stringWithString:@"Objective-C string"];NSString對象的方法
NSString str1 = @"Hello world!";
//uppercaseString,大寫
NSLog(@"%@",[str1 uppercaseString]);//結(jié)果: HELLO WORLD!
//lowercaseString,小寫
NSLog(@"%@",[str1 lowercaseString]);//結(jié)果: hello world!
//capitalizedString首字母大寫谷遂,其他字母小寫
NSLog(@"%@",[str1 capitalizedString]);//結(jié)果:Hello World!
//isEqualToString: 兩字符串是否相等
BOOL result= [@"abc" isEqualToString:@"aBc"];//結(jié)果:result=false
//hasPrefix: 前綴
NSLog(@"%i",[str hasPrefix:@"He"]);// result:1
//hasSuffix: 后綴
NSLog(@"%i",[str1 hasSuffix:@"ld!"]);//result:1
//intValue 類型轉(zhuǎn)換
NSLog(@"%i",[@"12" intValue]);//result: 12
//length 字符串長度
NSLog(@"%zi",[@"hello world,世界你好葬馋!" length]);//結(jié)果:17
//characterAtIndex:取出單個字符
NSLog(@"%c",[@"abc" characterAtIndex:0]);//取出制定位置的字符,結(jié)果:a
-
可變數(shù)組NSMutableString
字符串定義
NSMutableString *str1= [[NSMutableString alloc] initWithCapacity:10];
[str1 setString:@"hello"];//設(shè)置字符串方法
1) setString 設(shè)置
[str1 setString:@"hello"];//設(shè)置字符串
2) appendString 追加
[str1 appendString:@",world!"];//追加字符串,結(jié)果:hello,world!
3) appendFormat 格式化追加
[str1 appendFormat:@"我的年齡是%i肾扰。dear,I love you.",18];
4) replaceCharactersInRange:NSRange withString:NSString 替換
NSRange range=[str1 rangeOfString:@"dear"];
[str1 replaceCharactersInRange:range withString:@"Honey"];
5) insertString:NSString atIndex: NSNumber插入字符串
[str1 insertString:@"My name is Kenshin." atIndex:12];
6) deleteCharactersInRange:NSRange 刪除指定字符串
[str1 deleteCharactersInRange:[str1 rangeOfString:@"My name is Kenshin."]];
六畴嘶、數(shù)組
-
不可變數(shù)組NSArray
-
定義
//NSArray長度不可變所以初始化的時候就賦值,并且最后以nil結(jié)尾 1) NSArray *array1 = [[NSArray alloc] initWithObjects:@"abc",obj,@"cde",@"opq", nil]; 2) NSArray *array1 = [NSArray arrayWithObjects:@"abc",obj,@"cde",@"opq",@25, nil]; 3) NSArray *array2 = @[@"abc",obj,@"cde",@"opq",@25]; >#注意這里用@[]直接初始化數(shù)組集晚,而直接初始化字典用@{}窗悯,注意區(qū)分!甩恼!
-
屬性和方法
1) count : NSLog(@"%zi",array1.count);//數(shù)組長度,結(jié)果:5 #containsObject: 2) NSLog(@"%i",[array1 containsObject:@"cde"]);//是否包含某個對象蟀瞧,結(jié)果:1 #lastObject 3) NSLog(@"%@",[array1 lastObject]);//最后一個對象沉颂,結(jié)果:25 # indexOfObject: 4) NSLog(@"%zi",[array1 indexOfObject:@"abc"]);//對象所在的位置:0
數(shù)組遍歷(待續(xù).....)
-
數(shù)組排序
- 方法1条摸,使用自帶的比較器
NSArray *array=[NSArray arrayWithObjects:@"3",@"1",@"2", nil];
NSArray *array2= [array sortedArrayUsingSelector:@selector(compare:)]; - 方法2,(待續(xù)铸屉。钉蒲。。)
- 方法1条摸,使用自帶的比較器
-
- 注意
- NSArray中只能存放對象彻坛,不能存放基本數(shù)據(jù)類型顷啼,通常我們可以通過在基本數(shù)據(jù)類型前加@進行轉(zhuǎn)換;
- 數(shù)組中的元素后面必須加nil以表示數(shù)據(jù)結(jié)束昌屉;
- 上面數(shù)組操作中無論是數(shù)組的追加钙蒙、刪除、截取都沒有改變原來的數(shù)組间驮,只是產(chǎn)生了新的數(shù)組而已躬厌;
- 對象的比較除了使用系統(tǒng)自帶的方法,我們可以通過自定義比較器的方法來實現(xiàn)竞帽;
- 可變數(shù)組NSMutabelArray
-
定義
Person *person1=[Person personWithName:@"Kenshin"]; Person *person2=[Person personWithName:@"Kaoru"]; Person *person3=[Person personWithName:@"Rosa"]; NSMutableArray *array1=[NSMutableArray arrayWithObjects:person1,person2,person3, nil];
-
屬性和方法
Person *person4=[Person personWithName:@"Jack"];//此時person4的retainCount為1 #addObject: 添加一個對象元素 [array1 addObject:person4];//添加一個元素,此時person4的retainCount為2 #removeObject: [array1 removeObject:person3];//刪除一個元素 #removeLastObject [array1 removeLastObject];//刪除最后一個元素 #removeAllObjects [array1 removeAllObjects];//刪除所以元素 //注意當(dāng)往數(shù)組中添加一個元素時會retain因此計數(shù)器+1扛施,當(dāng)從數(shù)組中移除一個元素時會release因此計數(shù)器-1 //當(dāng)NSMutalbeArray對象release的時候會依次調(diào)用每一個對象的release
七、字典
-
初始化
#dictionaryWithObject NSDictionary *dic1=[NSDictionary dictionaryWithObject:@"1" forKey:@"a"]; #dictionaryWithObjectsAndKeys NSDictionary *dic2=[NSDictionary dictionaryWithObjectsAndKeys: @"1",@"a", @"2",@"b", @"3",@"c", nil]; #dictionaryWithObjects:NSArray forKeys:NSArray NSDictionary * dic3=[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"2", nil] forKeys:[NSArray arrayWithObjects:@"a",@"b", nil]]; #更簡單的方式 NSDictionary *dic4=@{@"1":@"a",@"2":@"b",@"3":@"c"};
-
方法
NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys: @"1",@"a", @"2",@"b", @"3",@"c", @"2",@"d", nil]; # count NSLog(@"%zi",[dic1 count]); //結(jié)果:4 # valueForKey: NSLog(@"%@",[dic1 valueForKey:@"b"]);//根據(jù)鍵取得值屹篓,結(jié)果:2 #[]直接引用建 NSLog(@"%@",dic1[@"b"]);//還可以這樣讀取疙渣,結(jié)果:2 #allKeys, allValues NSLog(@"%@,%@",[dic1 allKeys],[dic1 allValues]); #removeObjectForKey: 刪除一個元素 [dic1 removeObjectForKey:@"b"]; #addEntriesFromDictionary: 添加元素 [dic1 addEntriesFromDictionary:@{@"e":@"7",@"f":@"6"}]; #setValue 重新設(shè)置鍵值 [dic setValue:@"5" forKey:@"a"];
-
遍歷
方法1: for key in dic =>key, [dic objectForKey:key]
for (id key in dic1) { //注意對于字典for遍歷循環(huán)的是key
NSLog(@"%@=%@",key,[dic1 objectForKey:key]);
}方法2: 使用迭代器
NSEnumerator *enumerator=[dic1 keyEnumerator];
id key=nil;
while (key=[enumerator nextObject]) {
NSLog(@"%@=%@",key,[dic1 objectForKey:key]);
}方法3: 使用代碼塊
[dic1 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@=%@",key,obj);
}];
八、拆箱和裝箱
-
簡介
數(shù)組和字典中只能存儲對象類型堆巧,其他基本類型和結(jié)構(gòu)體是沒有辦法放到數(shù)組和字典中的妄荔。當(dāng)然你也是無法給它們發(fā)送消息的(也就是說有些NSObject的方法是無法調(diào)用的)泼菌,這個時候通常會用到裝箱(boxing)和拆箱(unboxing)。其實各種高級語言基本上都有裝箱和拆箱的過程啦租,例如C#中我們將基本數(shù)據(jù)類型轉(zhuǎn)化為Object就是一個裝箱的過程灶轰,將這個Object對象轉(zhuǎn)換為基本數(shù)據(jù)類型的過程就是拆箱,而且在C#中裝箱的過程可以自動完成刷钢,基本數(shù)據(jù)類型可以直接賦值給Object對象笋颤。但是在ObjC中裝箱的過程必須手動實現(xiàn),ObjC不支持自動裝箱内地。在ObjC中我們一般將基本數(shù)據(jù)類型裝箱成NSNumber類型(當(dāng)然它也是NSObject的子類伴澄,但是NSNumber不能對結(jié)構(gòu)體裝箱),調(diào)用其對應(yīng)的方法進行轉(zhuǎn)換阱缓。
-
裝箱方法
+(NSNumber *)numberWithChar:(char)value; +(NSNumber *)numberWithInt:(int)value; +(NSNumber *)numberWithFloat:(float)value; +(NSNumber *)numberWithDouble:(double)value; +(NSNumber *)numberWithBool:(BOOL)value; +(NSNumber *)numberWithInteger:(NSInteger)value;
-
拆箱方法
-(char)charValue; -(int)intValue; -(float)floatValue; -(double)doubleValue; -(BOOL)boolValue;
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1