Objective C 基礎(chǔ)01

基本數(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)中的位置如下圖:

Cocoa框架

二、NSObject

所有的Mac OS X和IOS程序都是由大量的對象構(gòu)成湘捎,而這些對象的根對象都是NSObject诀豁,NSObject就處在Foundation框架之中。通常我們會將他們分為幾類:

  1. 值對象
  2. 集合
  3. 操作系統(tǒng)服務(wù):文件系統(tǒng)窥妇、URL舷胜、進程通訊
  4. 通知
  5. 歸檔和序列化
  6. 表達式和條件判斷
  7. 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.

  1. NSRange 表示一個范圍

    • 定義: NSRange rg = {3, 5};
    • Make定義 NSRange rg = NSMakeRange(3,5);
    • 第一參數(shù)是起始位置第二個參數(shù)是長度: rg.location = 3; rg.length = 5;
  2. 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
  3. NSSize 表示一個二維的size, typedef CGSize NSSize;

    • 定義方法同上
    • NSSize s = NSMakeSize(10, 15);CGSize s2 = CGSizeMake(10, 15);
    • 兩個參數(shù)width, height, s.width = 10; s.height = 15;
  4. 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];

五急灭、字符串

  1. 不可變字符串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

  1. 可變數(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ù)組

  1. 不可變數(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ù)铸屉。钉蒲。。)
  • 注意
    • NSArray中只能存放對象彻坛,不能存放基本數(shù)據(jù)類型顷啼,通常我們可以通過在基本數(shù)據(jù)類型前加@進行轉(zhuǎn)換;
    • 數(shù)組中的元素后面必須加nil以表示數(shù)據(jù)結(jié)束昌屉;
    • 上面數(shù)組操作中無論是數(shù)組的追加钙蒙、刪除、截取都沒有改變原來的數(shù)組间驮,只是產(chǎn)生了新的數(shù)組而已躬厌;
    • 對象的比較除了使用系統(tǒng)自帶的方法,我們可以通過自定義比較器的方法來實現(xiàn)竞帽;
  1. 可變數(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);
      }];

八、拆箱和裝箱

  1. 簡介

數(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末非凌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荆针,更是在濱河造成了極大的恐慌敞嗡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件航背,死亡現(xiàn)場離奇詭異喉悴,居然都是意外死亡,警方通過查閱死者的電腦和手機玖媚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門箕肃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人今魔,你說我怎么就攤上這事勺像。” “怎么了错森?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵吟宦,是天一觀的道長。 經(jīng)常有香客問我涩维,道長殃姓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任激挪,我火速辦了婚禮辰狡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垄分。我一直安慰自己宛篇,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布薄湿。 她就那樣靜靜地躺著叫倍,像睡著了一般偷卧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吆倦,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天听诸,我揣著相機與錄音,去河邊找鬼蚕泽。 笑死晌梨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的须妻。 我是一名探鬼主播仔蝌,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荒吏!你這毒婦竟也來了敛惊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤绰更,失蹤者是張志新(化名)和其女友劉穎瞧挤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儡湾,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡特恬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盒粮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸵鸥。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡奠滑,死狀恐怖丹皱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宋税,我是刑警寧澤摊崭,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站杰赛,受9級特大地震影響呢簸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乏屯,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一根时、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辰晕,春花似錦蛤迎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽校辩。三九已至,卻和暖如春辆童,著一層夾襖步出監(jiān)牢的瞬間宜咒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工把鉴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留故黑,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓庭砍,卻偏偏與公主長得像倍阐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逗威,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容