1. 程式人生 > >Objective C程式 block程式碼塊 和property協議及Foundation框架

Objective C程式 block程式碼塊 和property協議及Foundation框架

block程式碼塊 和property協議

 1.block型別是一個c級別的語法和執行機制,他與標準c函式類似,不同之處在於,它除了有可執行程式碼以外,還包含了與堆。棧記憶體繫結的變數,因此block 物件包含著一組狀態資料,這些資料在程式執行是用於對行為產生影響,block被設計為可同時相容三種語言 oc 、c++ 、c。

   block 的基本使用

   int(^myBlock )(int)=(int num){    return  }

     1) 無參無返回值

     定義一個沒有引數\沒有返回值的block變數,同時賦值。

      void (^block變數名)()=^(){

           程式碼塊的語句

       }

      void (^myBlock1)(int)=^( ){

           NSLog(@"xxxx");

       }

       //使用block變數

        myBlock1(); //這樣就列印xxxxx 沒引數^小括號可以省略

      2)有引數無返回值

          void(^變數名)(引數型別及個數)=^(形參列表){

                 程式碼塊語句

            }

       viod (^myBlock2)(int,int)=^(int a, int b){

                 NSLog(@"a+b=%d",a+b);

       }

              myBlock2(3,6);

          //先定義變數,再賦值

         myblock2=^(int x,inty){

           NSLog(@"x*y =%d",x*y);

       }

     3)有引數有返回值

          定義一個有從哪回溯有返回值的block

          int(^myBlock3)(int,int)=^(intx,inty){

                return x+y;

       }

      //使用block ,接受返回值

        int sum =myBlock3 (23,45 );

      //重新給變數賦值

      myblock3=^(int x,inty){

       return x*y;

      }

 2.block的typedef

   利用typedef定義的block型別(和指向函式的只注重很像)

   typedef void(^myBlock)() :

   格式 : typedef 返回值型別(^新別名)(引數型別列表)

     typedf int (^myBlock1)(int ,int);

    給沒有返回值,沒有引數的block起一個別名

      myblock是一個型別不在是一個單純的變數

  typedef void (^myblock)();

   myblock f1;

   //block型別的變數

   f1 =^{

                NSLog(@“hellowworld");

    }

        //使用

         f1();

    定義有引數 \有返回值的block型別

  int (^block1)(int,int)=^(inta,intb){

               return a=b;

       }

    定義了一個block1的型別 返回值是int  有兩個int型別引數

 typedef int(^block1)(int,int);

     block1 b1;

      b1 =^(int x,int y){

           return x-y;

       }

      int s=  b1(2,3);

   連續定義多個 block1型別的變數

     block1 n,n2,n2;

 3.block訪問外部變數

      1)在block內部可以訪問外部的變數

         當定義block的時候會把外部變數以const 的方式複製一份,存放到block的所在記憶體中

      2)block內部不可以修改外部的變數值

      3)__block 修飾的變數內部可以修改 應為這裡不再以const的方式拷貝

 4.注意:

    1)靜態變數和全域性變數。在不加 __block 都會直接引用變數地址,也就意味著可以修改變數的值,在沒有__block引數的情況下

     2)全域性變數block:定義在函式外部的block是global 另外如果函式內部的block,但是沒有捕捉任何自動變數,那麼他也是全域性的

    3)棧block 區別,是否引用了外部變數

    4)堆block 則是對棧block copy得來,對全域性block copy不會有任何作用,返回的依然是全域性block。

 5.block作為函式的返回值

   步驟   1.使用typedef定義一個新型別

       //給block起個別名

        typedef int (^newType)(int num1,int num2);

        2.使用新型別作為函式的返回值

        //定義一個返回值是block型別的函式

        newType test4(){}

        3.定義變數接受函式的返回值(block型別)

        4.呼叫block

   //block型別作為函式的返回值

      newType test(){

       newType w1 =^{

        NSLog(@"xxxx");

        NSLog(@"helloword");

    }

       return w1;//返回值

  }

    //定義block型別的變數接受函式返回的結果

    newType n1 =test();

      //執行block

      n1();

 //重新定義一個新的型別newType2

  typedef int (^newType2)(int,int);

   newType2 test2 {

       return^(int a,int b){

               return a+b;

           }

 }   

    //n2 = ^(int a,int b){ return a+b ; };

      newType2 n2 = test2();

          //呼叫block

       int s = (23,23);

 7.block的掌握技巧

    1)block 結構的快速提示: 輸入inlineBlock

    2)我們在定義block變數的時候,形參型別及個數 這個位置處可以加上形參名

test(^int(int,int)){}

實現程式設計師工作

#import<Foundation/Foundation.h>

 //block型別的變數 workBlock 作為函式的引數

void work(void(^workBlock)() ){

    NSLog(@"起床刷牙");

    NSLog(@"去車站");

    NSLog(@"坐車");

    workBlock();//列印其它的

    NSLog(@"去車站");

    NSLog(@"坐車回家");

    NSLog(@"吃飯");

    NSLog(@"睡覺");

}

void workday(intn){

    typedef void(^workBlock) ();

    workBlock w;

    switch (n) {

        case 1:

            w=(^{

                NSLog(@"瞭解專案");

            });

            break;

        case 2:

            w=(^{

                NSLog(@"瞭解專案");

            });

            break;

        case 3:

            w=(^{

                NSLog(@"瞭解專案");

            });

            break;

        case 4:

          w=(^{

                NSLog(@"瞭解專案");

            });

            break;

        case 5:

            w=(^{

                NSLog(@"離職");

            });

            break;

        default:

            break;

    }

    //呼叫函式

    work(w);

}

int main(intargc, const char * argv[]) {

    @autoreleasepool {

        workday(5);

            return 0;

    }

}

二、protocol(協議)

    1.protocol 概念及基本使用

      什麼是協議:一些方法的宣告 ,一般寫到一個.h標頭檔案中

             方法有兩種:必須實現的 和選擇實現的

      協議的作用: 供其他的類區遵守

              如果一個類遵守了一個協議,就應該實現這個協議巨集定義的必須要實現的方法。

    2. 如何定義一個協議

      @protocol xxx <NSObject>  預設的情況下遵守的 NSObject 協議

      @end

     類遵守協議的格式

       1)遵守協議

         先導如入標頭檔案

         @interface  Person :NSObject <xxx>;

         @end

      2)遵守多個協議

         @interface 類名:NSObject<xxx,aaa ,bbb>;

         @end

      #import <Foundation/Foundation.h>

      //定義一個協議

      //定義協議的流程-->定義協議-->讓類遵守這個協議-->實現協議中對應的方法(必須要實現的)

      @protocol basepProtocol <NSObject>

       //宣告一些方法

       -(void)eat;

       -(void)run;

       @end

          //Person 遵守這個協議

      @intrface Person :NSObjeect<baseProtocol>

      @end

      @implementation  Person

        -(void)eat{

            NSLog(@"人在吃法飯");

        }

       -(void)run{

         NSLog(@"人在跑步");

         }

      @end

   當我們遵守了某個協議後,就有相當於這個類有了協議中所有的方法宣告

   3.protocol的其他用法

         protocol的使用注意

           1)protocol :就一個用途,用來宣告一大堆的方法(不能宣告成員變數),不能寫實現

           2)只要某個類遵守了這個協議,就擁有了這個協議中的所有方法

           3)只要父類遵守了某個協議,那麼子類也遵守 ,實現了協議方法,這些方法可以被子類繼承

           4)protocol宣告的方法可以讓任何類區實現 ,protocol就是協議

           5)oc中不能繼承多個類(單繼承)但是能夠遵守多個協議。繼承( :)協議( <> )

           6)基協議:<NSObject>是基協議,是最根本的協議,其中聲明瞭很多方法。

           7)協議可以遵守協議,一個協議遵守了另一個協議,就可以擁有另一個協議中的方法宣告

 4.protocol 中的@reuired 和@optional

         @required和@optional 是協議方法宣告中的兩個關鍵字

         他們主要控制方法是否要實現(預設的是@required),

          用途 在於程式設計師之間的交流

        @requried 表示必須要實現的方法

        @optional 可以選擇實現方法

 5.protocol 型別限制

    需要一女朋友的條件 定個協議

    housHoldProtocl.h

     @protocol  houseHoldProtocol <NSObject>

     - (void)zuoFan;

     - (void)xiyifu;

     @optional

      -(void)job;

     @end

   1)使用id儲存物件,物件的型別限制

      格式 id<協議名稱> 變數名

       id <Myportocol> obj1;

    //這樣寫後,表示是給人都滿足條件

    所以改為id<houseHoldProtocol>girl ;

     這樣就行限制了 傳進來的物件要遵守了協議才可以賦值

  2)物件賦值型別限制

    格式:類名<協議名>*變數名

        Person<hoseHoldProtocol>*p

           這樣必須是人的類的物件才能賦值

 3)物件的關聯關係

    要求人的狗會算數

      @intterface Person:NSObject

      //限制了這裡傳入的狗必須是遵守了dogProtocol的狗

     @property(nonatomic,strong)Dog<dogProtocol>*dog;

      @end

      //狗遵守協議

     @intreface Dog:NSObject<dogProtocol>

     @end

    id 和instancetype的區別

      1)instancetyp只能作為函式或方法的返回值

      2)id能作為方法或者函式的返回值、引數型別,也能用來定義一個變數

      3)instancetype 對比id的好處: 能精確的的限制返回值的具體型別

 6.protocol代理模式設計

     實現 嬰兒餓了要吃東西 ,困了要睡覺,

      嬰兒類   保姆類

#import <Foundation/Foundation.h>

@protocolbaoMuProtocol <NSObject>

-(void)eatToBaby;

-(void)sleepToBaby;

@end

import<Foundation/Foundation.h>

#import"baoMuProtocol.h"

@class baby;

@interface baoMu: NSObject<baoMuProtocol>

@property(nonatomic,weak) baby *baby;

@end

#import"baoMu.h"

#import"baby.h"

@implementationbaoMu

-(void)eatToBaby{

    NSLog(@"保姆正在給baby餵奶");

}

-(void)sleepToBaby{

    NSLog(@"保姆正在哄baby睡覺");

}

@end

#import<Foundation/Foundation.h>

@class baoMu;

#import"baoMuProtocol.h"

@interface baby: NSObject

@property(nonatomic,strong) baoMu<baoMuProtocol>*baomu;

-(void)babyWantEat;

-(void)babyWantsleep;

@end

#import"baby.h"

#import"baoMu.h"

@implementationbaby

-(void)babyWantEat{

    NSLog(@"baby在哭。。。。");

    [self.baomu eatToBaby];

}

-(void)babyWantsleep{

    NSLog(@"baby在哭。。。。");

    [self.baomu sleepToBaby];

}

@end

#import<Foundation/Foundation.h>

#import"baby.h"

#import"baoMu.h"

int main(intargc, const char * argv[]) {

    @autoreleasepool {

        baoMu *baomu =[[baoMu alloc] init];

        baby * ba =[[baby alloc] init];

        ba.baomu = baomu;

        [ba babyWantEat];

    }

    return 0;

}

protocol代理設計模式概念

   傳入物件,代替當前類完成某個功能,稱為代理模式。

   利用協議實現代理模式的主要思路:

     1)定義一個協議,裡面宣告代理需需要實現的方法列表。

     2)建立一個代理類,遵守上面的代理協議

     3)在需要代理的類中,定義一個物件型別為id且遵守代理協議的成員變數

     4)在類中呼叫成員變數_delegate(代理的方法),呼叫代理的類方法

     5)main.m或其他類檔案中,為類的成員變數賦值

   理解應用餓哦那個過中介找房子

#import<Foundation/Foundation.h>

@protocolfindHouseProtocol <NSObject>

-(void)findHouse;

@end

#import<Foundation/Foundation.h>

#import"findHouseProtocol.h"

@interfaceLinkHome : NSObject<findHouseProtocol>

@end

#import"LinkHome.h"

#import"findHouseProtocol.h"

@implementationLinkHome

-(void)findHouse{

    NSLog(@"鏈家地產正在給學生找房子");

}

@end

#import<Foundation/Foundation.h>

#import"findHouseProtocol.h"

@interfaceStudent : NSObject

@property(nonatomic ,strong) id<findHouseProtocol>delegate;

-(void)needHouse;

@end

#import"Student.h"

#import"LinkHome.h"

@implementationStudent

-(void)needHouse{

   NSLog(@"學生需要一個溫暖的家");

    [self.delegate findHouse];

}

@end

#import<Foundation/Foundation.h>

#import"Student.h"

#import"LinkHome.h"

int main(intargc, const char * argv[]) {

    @autoreleasepool {

       //代理類

        LinkHome *li = [[LinkHome alloc] init];

        Student*stu =[[Student alloc] init];

        stu.delegate=li;

           [stu needHouse];

        //代理類 LinKhome

        //代理物件 delegate

        //協議內容findHouseProtocol

        //協議內容  findHouse

    }

    return 0;

}

     Foundation 框架

一.Foundation框架的介紹

   框架是由許多類、方法、函式、文件按照一定的邏輯組織起來的集合,以便使研發程式變得更容易在os x下的mac作業系統中大約有80個框架為所有程式開發奠定基礎的框架稱為Foundation框架

     Cocoa 是Foundation和AppKit

     Cocao Touch是Foundation和UIKit

   要想使用Foundation框架中的功能,包含它的主檔案即可#import<Foundation/Foundation.h>

  Foundation 框架包含了很多開發中常用的資料型別結構體、列舉、類等。

二、NSString介紹及基本使用

     一個NSString物件就代表一個字串(文字類容),一般稱為NSString為字串類

   NSString的建立方式

      1)最直接的方式(這是常量字串)

          NSString *str = @"abc";

      2)格式化的方式

           NSString *str1 =[NSString stringWithFormat:@"%@",@"jack"];

           NSString *str2 =[NSString stringWithFormat:@"my age is %d",10]

       注意:這中寫法,字串是儲存在記憶體的堆區(地址不一樣)

      3)從檔案中讀取

          NSString *str3 = [NSStringWithContentsOfFile:@"/Users/apple/Desktop/t.txt"encoding:NSUTF8StringEncodingerror:&err];

        注意:

            如果讀取到內容 

      if(err == nil){

       NSLog(@"讀取成功的情況");

       NSLog(@"%@",str3);

      }else{

       NSLog(@"檔案讀取失敗");

       NSLog(@"%@",err);

    }

   //可以通過[err loclizedDescription];列印簡單的錯誤資訊

   //NSLog(@"%@",[err localizeDescription])

 三、.NSURL讀寫字串

 NSString *str = @"$10000000";

 //URL統一資源定位符

//NSURL OC提供了一個URL處理的一個類

 //http  https// 加密  ftp://  file:// 本地檔案  NSURL 寫入檔案

 1)通過URLWithString 構建一個NSURL

      URLWithString 可以構建本地路徑的URL

               可以構建路徑,呼叫手機系統的程式

       NSURL *url = [NSURL URLWithString:@"sms://10086"];

2) fileURLWithPath 獲取本地檔案路徑

     NSURL *url = [NSURLfileURLWithPath:@"/Users/zhaoxiaohu/Desktop/4.txt"];

     if([str writeToURL:url atomically:YES encoding:NSUTF8StringEncodingerror:nil]){

           NSLog(@"寫入成功");

     }

     NSString *str2 = [NSString stringWithContentsOfURL:urlencoding:NSUTF8StringEncoding error:nil];

四.NSString 的使用介紹

1.字串比較

     NSString *str1 [email protected]"_abc";

      NSString *str2 [email protected]"bcd";

   //取出每個字元的ASCII 碼值,比較ASSICC碼值的大小

   //compare方法比較大小   預設的區分大小寫 這個函式不能增加條件

   //        NSComparisonResultreslut = [str1 compare:st2];

   //比較的時候,不區分大小寫,參考字元的個數

   NSComparisonResult result =[str1 compare:str2options:NSCaseInsensitiveSearch | NSNumericSearch];

   switch (result) {

   case NSOrderedAscending:

   NSLog(@"str>str2 升序");

   break;

   case NSOrderedDescending:

   NSLog(@"str<str2 降序");

   break;

   case NSOrderedSame:

   NSLog(@"str==str2 ");

   break;

   default:

   break;

    }

   //地址比較判斷字元處是否相等。真正的相等  他是區分大小寫的

   if (  [str1 isEqualToString:str2]){

   NSLog(@"相等");

   }else{

   NSLog(@"不相等");

    }

2.NSString前後綴檢查及搜尋

   //檢車字串的前後綴

    1)如何檢測一個字串是否是網址 http://   https://

   //檢測一個字串的前後綴是否以 http://   https:// 開頭

   //[str hasPerfix:@"要檢測的內容"]

   if( [url hasPrefix:@"http://"]| [urlhasPrefix:@"https://"]){

   NSLog(@"是一個網址");

   }else{

   NSLog(@"這不是一個網址");

    }

    2)檢測車字串的字尾

   //xxx.jpg 判斷後綴是不是."jpg"

       NSString *imgName [email protected]"xxxx.jpg";

    if ([imgName hasSuffix:@".jpg"]|[imgNamehasSuffix:@".png"]|[imgName hasSuffix:@".jpeg"])

       {

       NSLog(@"這是一個圖片");

       }else{

   NSLog(@"這不是一個圖片");

    }

 3.字串的查詢

    查詢某個字串在另外一個字串首次出現的位置

       查詢2 在 1中首次出現的位置

    如果查詢到了,返回2在1中的位置和長度

    如果查詢不到,返回的資訊:

           location   特別大的數(NSNotFound)最大的long型別的數

           length     0

   range 結構體變數  NSRange 結構別名

   NSString *str [email protected]"ssadjdiosdknkliiwprp";

   NSString *[email protected]"ios";

   NSRange range =[str rangeOfString:str1];

   //range.location 表示字串首次出現的位置

   //range.length 字串出現的長度(實質上就是子字串的長度)

   if (range.location!=NSNotFound) {

   NSLog(@"%lu,%lu",range.location,range.length);

   }else{

   NSLog(@"在%@中沒有找到這個字串%@",str,str1);

    }

 4.字串的擷取和替換

  1).從開始位置,到最後結束(包含xx這個位置)

   NSString *str1 =[str substringFromIndex:5];

   NSLog(@"str1 =%@",str1);

  2)從開始位置到xx位置結束(不包含檔案的位置)

   NSString *str2 = [str substringToIndex:5];

   NSLog(@"str2 =%@",str2);

   3)擷取一範圍  range

   NSRange r1={3,4};

   NSString *str3=[str substringWithRange:r1];

   NSLog(@"str3 =%@",str3);

    4)字串的替換

   //@"sadsaldjejeiwrwwrjasjlasd"------>a 替換成"*"

   //@"sad dfd f gfgf fhf sd"--->去掉空格

   NSString *str = @"sadsaldjejeiwrwwrjasjlasd";

   //str stringByReplacingOccurrencesOfString:@"源字串中的內容"withString:@"要替換成新的內容"把a替換成 *

   NSString *newStr =[strstringByReplacingOccurrencesOfString:@"a" withString:@"*"];

   NSLog(@"newStr= %@",newStr);

   //把空格給去掉

   [email protected]"sad dfd f gfgf fhf sd";

   newStr =[str stringByReplacingOccurrencesOfString:@"a"withString:@""];

   NSLog(@"newStr= %@",newStr);

5.NSRange的使用

   NSRange range; //結構體變數

   NSRange * r; // r結構體指標

   //range變數的初始化方式

    1)通過結構體變數訪問成員

   range.location =3;

   range.length =2;

   2)結構體變數整體賦值n

   range =(NSRange){5,3};

   NSRange r2={5,6};//最簡單

   //oc中新增的 NSMakeRange結構體變數賦值

   NSRange r4 =NSMakeRange(3, 4);

   //把結構體變數轉換為 NSString型別

   NSLog(@"%@",NSStringFromRange(r4));

 6.NSString的其他區用法

   OC的字串和 C的字串互相轉換問題

   char*  NSString

   1) C---->OC物件

   char *s = "zhangsanfeng";

   printf("%s\n",s);

    思路:建立一個OC的字串物件,用C語言的字串建立

   NSString *str = [NSString stringWithUTF8String:s];

   NSLog(@"str = %@",str);

   2) OC物件 --> C的字串

   NSString *str2 = @"zbz";

   // 把str2 轉 C的字串

   const char *s1 = [str2 UTF8String];

   printf("s1 = %s\n",s1);

 五、NSMutableString的使用介紹

  1.使用介紹

   //不可變: 字串佔用的空間 和 字串 的內容,都不能改變

   //可變: 字串佔用的空間和字串的內容,都可以改變

   NSString *str = @"Jack";  //常量區

   NSLog(@"str addr =%p",str);

   str = @"Rose";

   NSLog(@"str addr =%p",str);

   //可變的字串

   NSMutableString *str2 = [NSMutableStringstringWithFormat:@"Jack"];

   NSLog(@"str2 addr =%p",str2);

   [str2 appendString:@"&Rose"];

   NSLog(@"str2 addr =%p",str2);

   NSLog(@"str2 = %@",str2);

   //思考:

   //建立一個可變的空字元

   NSMutableString *str3 = [NSMutableString string];

   NSLog(@"str3 = %@",str3);

   for (int i=0; i<10; i++) {

   [str3 appendString:@" itcast"];

    }

   NSLog(@"str3 = %@",str3);

 2.常用方法

   NSMutableString *str = [NSMutableString string];

   1) appendFormat 格式化的新增字串

   //                  0123456789

   [str appendFormat:@"http://www.baidu.com/%d",100];

   NSLog(@"%@",str);

   2) 刪除字串一部分內容

   [str deleteCharactersInRange:NSMakeRange(3, 4)];

   NSLog(@"%@",str);

   3) 插入一個字串

   [str insertString:@"p://" atIndex:3];

   NSLog(@"%@",str);

   4) 替換字串的一部分內容

   [str replaceCharactersInRange:NSMakeRange(11, 5)withString:@"itcast"];

       NSLog(@"%@",str);

    }

 六、NSArray使用介紹

 1.介紹

   NSArray特點:  一旦建立成功,內容不可改變  只能存放OC物件

   1)建立一個空陣列

   NSArray *arr1 = [NSArray array];

   2)建立陣列,只有一個元素

   NSArray *arr2 = [NSArray arrayWithObject:@"1"];

   3)建立陣列,有多個元素

   nil 表示陣列賦值結束

   // 常見寫法

   NSArray *arr3 = [NSArrayarrayWithObjects:@"one",@"two",@1, nil];

   NSLog(@"arr3 = %@",arr3);

   4)呼叫物件方法,建立陣列

   //nil Nil NULL  NSNULL

   NSArray *arr4 = [[NSArray alloc]initWithObjects:@"three",[NSNull null],@"four", nil];

   NSLog(@"arr4 = %@",arr4);

   5)用一個數組可以建立另外一個數組

   NSArray *arr5 = [NSArray arrayWithArray:arr3];

   NSLog(@"arr5 = %@",arr5);

 2.陣列的常見用法

   NSArray *arr3 = [NSArrayarrayWithObjects:@"one",@"two",@1,@"three", nil];

   NSLog(@"arr3 = %@",arr3);

   1)獲取陣列的長度  count獲取陣列的元素的個數

   NSLog(@"%ld",arr3.count);

   2)根據下標,獲取下標對應的物件

   NSLog(@"%@",[arr3 objectAtIndex:3]);

   3)返回元素的下標

   NSUInteger loc = [arr3 indexOfObject:@"three"];

   NSLog(@"%ld",loc);

   4)陣列中是否包含了某個元素

   if([arr3 containsObject:@"four"]){

   NSLog(@"包含此元素");

   }else{

   NSLog(@"不包含");

    }

   用簡化的方式,來定義和訪問陣列元素

   1)用簡化的方式,定義陣列

    格式: @[ 陣列元素 ]

   NSArray *arr [email protected][@"1",@"one",@"3",@4,@"ONE"];

   NSLog(@"arr = %@",arr);

   NSString *str =[arr objectAtIndex:2];

   NSLog(@"%@",str);

   2)用簡化的方式訪問陣列元素

   str = arr[1];   //C語言形式的陣列元素訪問

   NSLog(@"%@",str);

 3.遍歷方法

    定義一個數組

   NSArray *arr [email protected][@"one",@"two",@"three",@"four"];

    對陣列進行遍歷

   1) 普通的方式,通過下標訪問

   for (int i=0; i<arr.count; i++) {

   NSLog(@"-> %@",arr[i]);

    }

   2) 快速列舉法 for迴圈的增強形式

   for (NSString * str in arr) {

   NSLog(@"---> %@",str);

    }

   3) 使用block的方式,進行訪問

                                陣列元素            元素下標     是否停止

   //stop:YES  會停止, stop:NO 不會停止

   [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

   if(idx == 2){

   *stop = YES;  //停止  // break;

   }else{

   NSLog(@"idx = %ld,obj = %@",idx,obj);

    }

   }];

4.讀寫檔案

      NSArray *array = [NSArrayarrayWithObjects:@"one",@"zbz",@"cgx",@"sb",@"cjk",@"senni",nil];

      //把NSArray 中的內容,寫入到檔案中

      //arr.plist 一種特殊的檔案格式

      BOOL isWrite =  [arraywriteToFile:@"/Users/zhaoxiaohu/Desktop/arr.xml" atomically:YES];

      if(isWrite){

           NSLog(@"寫入成功");

        }

      從檔案中,讀取一個數組資訊

       NSArray *readArr = [NSArrayarrayWithContentsOfFile:@"/Users/zhaoxiaohu/Desktop/arr.xml"];

       NSLog(@"readArr = %@",readArr);

5.NSArray 與陣列

   //定義一個數組

   NSArray *arr = @[@1,@2,@3,@4];

   1)需求: 把陣列中的元素用 "-" 連線起來

    [陣列componentsJoinedByString @"分隔符"];

   // 1-2-3-4

   NSString *str = [arr componentsJoinedByString:@"-"];

   NSLog(@"str = %@",str);

   2) 給一個字串,分割成一個數組

   // 400-800-12580   //取得 400    12580   800

   NSString *str2 = @"400-800-12580";

   NSArray *arr2 = [str2 componentsSeparatedByString:@"-"];

   NSLog(@"%@",[arr2 firstObject]);

   NSLog(@"%@",[arr2 lastObject]);

   NSLog(@"%@",arr2[1]);

   str2 = @"400-800-12580#400-888-11200";

   NSArray *arr3 = [str2 componentsSeparatedByString:@"#"];

   NSLog(@"arr3 = %@",arr3);

   //第一個電話的每一部分

   NSArray *arr4 =  [[arr3firstObject] componentsSeparatedByString:@"-"];

   NSLog(@"arr4 = %@",arr4);

   NSArray *arr5 =  [[arr3 lastObject]componentsSeparatedByString:@"-"];

   NSLog(@"arr5 = %@",arr5);

    }

七、NSMutableArray的基本使用

    陣列的使用

   1)建立陣列

       i. 空陣列

           NSMutableArray *arr1 = [NSMutableArray array];

           NSLog(@"%p",arr1);

       ii.建立的時候初始化一個元素

           NSMutableArray *arr2 =[NSMutableArray arrayWithObject:@"one"];

       iii.建立陣列的時候,初始化多個元素

           NSMutableArray *arr3 = [NSMutableArrayarrayWithObjects:@"one",@"two",@3,nil];

       IV . 建立一個數組,並且指定長度,

           NSMutableArray *arr4 = [NSMutableArray arrayWithCapacity:5];

   2) 新增元素

   [arr1 addObject:@"fengjie"];

   NSLog(@"%p",arr1);

   //插入元素到指定的位置

   [arr1 insertObject:@"zbz" atIndex:0];

   3) 刪除元素

    根據物件內容刪除

   //        [arr1removeObject:@"zbz"];

   //根據位置刪除

   //        [arr1removeObjectAtIndex:1];

   //全部刪除

   [arr1 removeAllObjects];

   4) 修改元素

   //two --> four

   [arr3 replaceObjectAtIndex:1 withObject:@"four"];

   //four --> five

   //更加簡單地方法

   arr3[1] = @"five";

   NSLog(@"%@",arr3);

   5) 查詢元素

   BOOL isSearch = [arr3 containsObject:@"four"];

   NSLog(@"%d",isSearch);

   /6) 交換元素

   // 1   2   3  4   5

   // 5   2   3  4   1

   //temp = a[0];

   //a[0] = a[len-1];

   //a[len-1] = temp;

   NSMutableArray *arr5 =[NSMutableArray arrayWithObjects:@1,@2,@3,@4,@5,nil];

   // 可以交換陣列元素

   [arr5 exchangeObjectAtIndex:0 withObjectAtIndex:4];

   NSLog(@"%@",arr5);

八、NSDictionary的介紹及使用

 1.介紹

   NSDictionary 不可變的,一旦建立,內容就不能新增\刪除(不能改動)

    1)建立空字典

   NSDictionary *dict1 = [NSDictionary dictionary];

       // key    value

       // zs ---> 張三

       // ls ---> 李四

       // mz ---> 碼子

   2)建立只有一組鍵值對的字典

   NSDictionary *dict2 = [NSDictionarydictionaryWithObject:@"zhangsan" forKey:@"zs"];

   3)建立多組鍵值對的字典

   // value值,key值

   NSDictionary *dict3 = [NSDictionarydictionaryWithObjectsAndKeys:@"value1",@"k1",@"value2",@"k2",nil];

   //注意;

   // 字典的key值和value值,都必須是物件

   4)快速建立一個字典

   @{,,key值:value值,,,};

   key值不能重複:

    如果重複了,也不會報錯

    如果重複了,最後新增的將不能夠儲存到字典中

       NSDictionary *dict4 [email protected]{@"zs":@"zhaosi",@"zs":@"zhangsan",@"ls":@"lisi",@"bz":@"banzhang"};

   NSLog(@"%@",dict4); //以%@格式列印字典,控制檯輸出一個{   }

   5)獲取字典的長度

       NSLog(@"%lu",dict4.count);

   6)根據key值取出value值

       //      zs      zhaosi

       //                                  key

       NSString *str = [dict4 objectForKey:@"zs"];

       NSLog(@"str = %@",str);

   7)字典的遍歷問題

    /第一步:獲取所有的key

    第二步:根據key獲取value

           for(NSString *key in dict4){

           NSLog(@"key = %@,value = %@",key,[dict4 objectForKey:key]);

           }

                                                   key     value       stop

       [dict4 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

       NSLog(@"%@ --> %@",key,obj);

       }];

2.簡寫及檔案操作

   1)用簡寫形式定義一個字典

   NSDictionary *dict [email protected]{@"zbz":@"zhangbozhi",@"cgx":@"chenguanxi",@"xzmly":@"hello"};

   2)用簡寫形式,獲取key對應的value

       NSLog(@"%@",dict[@"zbz"]);

   3)把字典儲存到檔案中

        BOOL isWrite = [dictwriteToFile:@"/Users/zhaoxiaohu/Desktop/dict.plist" atomically:YES];

           if (isWrite) {

           NSLog(@"寫入成功");

           }

   4)從檔案中讀取字典

       NSDictionary *readDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/zhaoxiaohu/Desktop/dict.plist"];

       NSLog(@"readDict = %@",readDict);

 九、NSMutableDictionary的介紹及使用

       1)可變字典的建立

       NSMutableDictionary *dict1 = [NSMutableDictionary dictionary]; //建立空字典

       NSMutableDictionary *dict2 = [NSMutableDictionarydictionaryWithCapacity:3];

       2)給可變字典新增鍵值對

       [dict1 setValue:@"zhaosi" forKey:@"ls"];//因為key值重複了,所以新增不上

       [dict1 setValue:@"lisi" forKey:@"ls"];  // ls

       [dict1 setValue:@"liuneng" forKey:@"ln"];

       NSLog(@"%@",dict1);

       3)刪除

           [dict1 removeObjectForKey:@"ls"];

           [dict1 removeAllObjects];

       NSLog(@"%@",dict1);

       4)修改

       [dict1 setObject:@"zhaosi" forKey:@"ls"];

       //簡寫形式

       dict1[@"ls"] = @"xxxxx";

       NSLog(@"%@",dict1);

       5)查詢

       獲取所有的key值

       NSArray *arr = [dict1 allKeys];

       if([arr containsObject:@"ls"]){

           NSLog(@"存在ls的key");

       }

十、NSFileManger介紹使用

 1.使用介紹

       //NSFileManager 用於判斷

       NSString *filePath = @"/Users/zhaoxiaohu/Desktop/arr.plist";

       NSString *filePath2 = @"/";

       1) 判斷檔案是否存在

       建立檔案管理物件

       呼叫defaultManager 建立一個檔案管理的單例物件

       單例物件:在程式執行期間,只有一個物件存在

       NSFileManager *fm = [NSFileManager defaultManager];

       // YES 存在   NO 不存在

       BOOL isYES = [fm fileExistsAtPath:filePath];

       NSLog(@"-->%d",isYES);

       if(isYES){

       BOOL isDir;

       2) 判斷是否是一個目錄

       [fm fileExistsAtPath:filePath isDirectory:&isDir];

       if (isDir) {

       NSLog(@"這是一個目錄");

       }else{

       NSLog(@"這不是一個目錄");

       }

       }

       3) 判斷檔案是否可讀

       isYES = [fm isReadableFileAtPath:filePath];

       4) 是否可寫

       isYES = [fm isWritableFileAtPath:filePath2];

       5) 是否可刪除

       isYES = [fm isDeletableFileAtPath:filePath2];

       NSLog(@"-->%d",isYES);

2.深入用法(一)

       //建立檔案物件

       NSFileManager *fm = [NSFileManager defaultManager];

       NSString *filePath [email protected]"/Users/zhaoxiaohu/Desktop/arr.plist";

           NSString *dirPath = @"/Users/zhaoxiaohu/Desktop/a";

       1)如何獲取檔案的資訊(屬性)

       NSDictionary *dict = [fm attributesOfItemAtPath:filePath error:nil];

       NSLog(@"%@",dict);

       NSLog(@"%@,%@",[dictobjectForKey:@"NSFileOwnerAccountName"],dict[@"NSFileOwnerAccountName"]);

       2)獲取指定目錄下檔案及子目錄

       //使用遞迴的方式獲取當前目錄及子目錄下的所有的檔案及資料夾

       NSArray *subPaths = [fm subpathsAtPath:dirPath];

       //subpathsOfDirectoryAtPath 不是使用遞迴的方式獲取的

       subPaths = [fm subpathsOfDirectoryAtPath:dirPath error:nil];

       NSLog(@"subPaths = %@",subPaths);

       3)獲取指定目錄下的檔案及目錄資訊(不在獲取後代路徑)

       subPaths = [fm contentsOfDirectoryAtPath:dirPath error:nil];

       NSLog(@"subPaths = %@",subPaths);

 深入用法(二)

       //建立檔案管理物件

       NSFileManager *fm = [NSFileManager defaultManager];

       //如何建立目錄 (路徑 :/Users/zhaoxiaohu/Desktop/aaa)

       NSString *createDirPath = @"/Users/zhaoxiaohu/Desktop/aaa/ccc/bbb/love.txt";

                fmcreateDirectoryAtPath:@"路徑" withIntermediateDirectories:YES/NO 建立路徑的時候,YES自動建立路徑中缺少的目錄,NO的不會建立缺少的目錄attributes:屬性的字典 error:錯誤物件

                BOOL isYES = [fmcreateDirectoryAtPath:createDirPath withIntermediateDirectories:YESattributes:nil error:nil];

                if (isYES) {

                    NSLog(@"成功");

                }

       如何建立檔案

       NSString *str = @"每當我錯過一個女孩,我就向山上放一塊磚,於是就有了長城";

       writeToFile

           fm createFileAtPath:@"路徑" contents:NSData型別的資料 attributes:檔案的屬性的字典

       建立NSData?   是一個處理二進位制資料的類

       NSString -----> NSData

       NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

       BOOL isYes;

           // createFileAtPath 建立檔案

       isYes = [fm createFileAtPath:createDirPath contents:dataattributes:nil];

           NSLog(@"isYes = %d",isYes);

       如何copy檔案

           NSString *targetPath [email protected]"/Users/zhaoxiaohu/Desktop/aaa/ccc/love.txt";

       [fm copyItemAtPath:createDirPath toPath:targetPath error:nil];

       NSString *targetPath [email protected]"/Users/zhaoxiaohu/Desktop/aaa/love.txt";

       //如何移動檔案

       [fm moveItemAtPath:createDirPath toPath:targetPath error:nil];

 

相關推薦

Objective C程式 block程式碼 property協議Foundation框架

block程式碼塊 和property協議  1.block型別是一個c級別的語法和執行機制,他與標準c函式類似,不同之處在於,它除了有可執行程式碼以外,還包含了與堆。棧記憶體繫結的變數,因此block 物件包含著一組狀態資料,這些資料在程式執行是用於對行為產生影響,blo

Objective-C語法之程式碼(block)的使用

程式碼塊本質上是和其他變數類似。不同的是,程式碼塊儲存的資料是一個函式體。使用程式碼塊是,你可以像呼叫其他標準函式一樣,傳入引數數,並得到返回值。 脫字元(^)是塊的語法標記。按照我們熟悉的引數語法規約所定義的返回值以及塊的主體(也就是可以執行的程式碼)。下圖是如何把塊

objective C程式物件

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- /* 類:一類事物共同特徵和行為的

Objective-C 內存管理retainrelease

計數 nco 優雅 tracking con void sep res 釋放資源 OC使用引用計數來管理內存,每個繼承NSObject的對象,內部都維護了一個引用計數器retainCount。當對象創建時(調用alloc或者new)引用計數器會+1, 手動調用retai

理解Web應用程式程式碼結構執行原理(3)

1、理解Web應用程式的執行原理和機制        Web應用程式是基於瀏覽器/伺服器模式(也稱B/S架構)的應用程式,它開發完成後,需要部署到Web伺服器上才能正常執行,與使用者互動的客戶端是網頁瀏覽器。 瀏覽器負責顯示來自伺服器的資料和接受使用者的輸入資料,也

unity 靜態程式碼構造方法執行時機次數

using UnityEngine; using System.Collections; public class test : MonoBehaviour { void Start () { person p01 = new person(); person p

Objective-C學習筆記】變數基本的資料型別

OC是增強了C的特性,所以在變數和基本資料型別上基本與C一致。 在OC中變數命名有如下規則: 由字母、數字、下劃線、$符號組成 必須以字母、下劃線、$符號開頭 大小寫敏感 在OC中定義變數的時候不能使用OC的保留字,OC的保留字如下: OC中有如下基本資料型別: in

安全程式設計(十五)- finally程式碼Exception物件

1.異常處理的時候,finally程式碼塊的作用是什麼?         無論是否丟擲異常,fianlly程式碼塊總會被執行!就算沒有catch的情況下丟擲異常,finally任會被執行。finally程式碼塊的作用是釋放資源,比如I/O緩衝區,資料庫的連

【面相物件】靜態程式碼、構造程式碼建構函式的執行順序

前言:java有四大程式碼塊:靜態程式碼塊、構造程式碼塊、區域性程式碼塊、同步程式碼塊。 ……………………………………………………………………………………………… ……………………………………………………………………………………………… ………………………………………………

java中構造程式碼、static程式碼區域性程式碼的區別

先上程式碼: class StaticCode{ int age; // static程式碼塊 static{ System.out.println("static程式碼塊"); } //構造程式碼塊

java 靜態程式碼spring @value等註解注入順序

今天在引用yml配置檔案的時候,因為用到了繼承的靜態程式碼塊。類與類有繼承關係的靜態程式碼塊是先執行父類靜態程式碼塊再執行子類靜態程式碼塊,這個問題不用說。 今天探索的是與spring相關的執行順序 我在專案啟動的時候需要去載入部分配置檔案,這些配置檔案的資訊在子類的靜態程式碼塊需要使用

javaSE (三十五)多執行緒 ( 多執行緒實現方法區別、同步程式碼方法(執行緒安全))

主要還是熟悉api,熟悉方法,簡單,需要多實踐 1、 多執行緒實現方法和區別: 多執行緒實現的兩種方法: 1)類繼承Thread類或實現Runnable介面,重寫run()方法 2)建立Thread的子類物件(需要開幾個執行緒就建立幾個物件,可建立匿名內部類) 3)子類

同步程式碼同步方法案例實戰

什麼是同步 同步就是加鎖,不讓其它人訪問 synchronized指的就是同步的意思 什麼情況下需要同步 當多執行緒併發, 我們希望某一段程式碼執行的過程中CPU不要切換到其他執行緒工作. 這時就需要同步,否則會有執行緒安全問題。 同步程式碼塊 使用synchronized關鍵字

Java靜態程式碼靜態方法

1 靜態程式碼塊:有些程式碼必須在專案啟動的時候就執行,這種程式碼是主動執行的(當類被載入時,靜態程式碼塊被執行,且只被執行一次,靜態塊常用來執行類屬性的初始化) 2 靜態方法:需要在專案啟動的時候就初始化,在不建立物件的情況下,這種程式碼是被動執行的(靜態方法在類載入的時候就已經載入 可以用類

Objective-cBlock

# Block 概述 標準C裡面沒有Block, C語言的後期擴充套件版本, 加入了匿名函式; C++、JS、 Swift等語言中, 有類似語法, 叫做閉包! block語法和函式指標很相似。回顧, C語言中的指標函式: c int(*) (int x,

Objective-C iOS純程式碼佈局 一堆程式碼可以放這裡!

前言: 最近寫的文章都是創業類,好吧,今天好好寫寫技術類的文章! 不過分享的不是IOS相關的文章,畢竟這幾天在速成IOS,看的是objective-c,由於速成的很快,好累! 好在現在基本已經入了點門道了,這才看的懂新人的程式碼,才能提前感受程式碼危機。 對於IOS的速成口訣,回頭再分享,今天先分享一

python程式碼小資料池

id和is 在介紹程式碼塊之前,先介紹兩個方法:id和is,來看一段程式碼 1 # name = "Rose" 2 # name1 = "Rose" 3 # print(id(name)) 4 # print(id(name1)) # 兩個id相同 5 # print(name == name

powermock如何阻止靜態程式碼呼叫私有方法

在專案中進行單元測試,發現很多類都採用了靜態程式碼塊,而靜態程式碼塊在class被容器load的時候就要被執行,如果執行錯誤就會導致junit單元測試錯誤,那麼如何阻止靜態程式碼塊的執行呢? 如果我有一個被測試的Class如下: package com.roger.tes

C# 機房合作程式碼

一、dataGridView 1.右鍵出快捷選單 if (e.Button == MouseButtons.Right) { if (e.RowIndex >= 0)

c++ 程式崩潰的除錯解決方法

程式崩潰是我以前很頭疼的問題,尤其是有時出現,有時不出現的問題,除錯也抓不到,這種清空我們通常是通過在exe程式崩潰時生成dump檔案來定位的; 首先在程式碼中  main.cpp中定義函式: LONG WINAPI UnhandledExceptionFilter_SpawD