你的位置:首页 > 操作系统

[操作系统]oc总结


OC10天大纲

 

一、类和对象

1、什么是类?

      同一种对象的抽象就是类。

2、什么是对象?

      世界上的任何事物都可以称为对象,每个对象都有他自己的属性和行为。

3、如何创建一个类(请把一个.h和一个.m粘过来解释里面的每一块东西)

      .h文件由

          @interface 类名 : 父类

          @end

       组成

     1、@interface指引着这个类的名字

     2、interface后面紧跟着这个类的名字,这里是Human

     3、类名后面紧跟着:(冒号),冒号指引着这个类的父类(爸爸类)

     4、:后面就是父类的名字,这里是NSObject 

      在interface的下面,我们可以声明全局(这个类的全局)的成员变量、属性、方法 

      最后以@end结束

             @interface Human : NSObject

             //成员变量

             {

                 int _age;//成员变量年龄    

                 int _height;//成员变量身高

             }

             -(void)setAge:(int)newAge;

             -(void)setHeight:(int)newHeight;

             -(int)getAge;

             -(int)getHeight;

             @end

 

           #import "Human.h"

             @implementation Human

             -(void)setAge:(int)newAge

             {

                  _age = newAge;

             }

             -(void)setHeight:(int)newHeight

             {

                  _height = newHeight;

             }

             -(int)getAge

             {

                  return _age;

             }

             -(int)getHeight

             {

                  return _height;

             }

             @end

4、如何创建一个对象

   使用一个类的成员变量和方法

   1、实例化一个这个类的对象

   2、使用这个对象来调用这个类的对象方法(减方法)

   3、给这个对象的成员变量赋值

   4、取出这个对象的成员变量的值

   Human *lucy = [[Human alloc]init];

   //实例化一个Human类的对象,lucy是一个指针,使用alloc来分配一块内存给这个对象        

   //OC方法的调用要用[]括起来

   //[]中前面是调用方法的(对象/类),谁来调用方法

   //用空格把谁和方法隔开

   //空格后面是要调用的方法名

   [lucy setAge:16];

   [lucy setHeight:160];        

    NSLog(@"lucy的年龄是%d岁,身高是%dcm",[lucy getAge],[lucy getHeight]);

5、setter方法和getter方法

   //setter

   OC的方法:

      1、(-/+)符号,-的时候这个方法由这个类的对象响应,+的时候直接由这个类来响应

      2、符号后面紧接着(括号),括号里面是这个方法的返回值

      3、(括号)后面跟着的是方法体(方法名),这个方法名首字母小写,后面每个单词的首字母大写(驼峰命名法)

      4、当有参数的时候,将由:(冒号)把参数与方法体进行分割

      5、:(冒号)后面紧跟着参数的数据类型,由()包围,数据类型后面是参数的名称

      6、当有多个参数的时候用“ ”空格分割,但是每个参数前,要有这个参数的方法体

      7、方法名要有意义,让人能看懂

6、OC和C的区别

        1、OC工程名的第一个字母大写,之后每一个单词的首字母大写

        2、OC文件扩展名为.m,C文件扩展名为.c

         3、OC包含头文件使用#import,C包含头文件使用#include,#import的作用就是帮我们解决了重复包含的问题

         4、OC打印使用NSLog,C打印使用printf。

         5、NSLog里面“”前要加上@符号

         6、NSLog自动换行不需要手动\n

         7、文件名的第一个字母大写,之后每一个单词的首字母大写

 

二、字符串

1、OCSting和CString的区别

       使用alloc创建一个OC字符串

     1、直接把一个NSString通过init方法赋值给我们新创建的NSString字符串

         NSString *tempString = @"hello";//把一个字符串常量赋予一个字符串指针

         NSLog(@"tempString is %@",tempString);//OC字符串的打印不能用%s,而要用%@(实际上%@在OC里面什么都能打)

         NSString *string1 = [[NSString alloc] initWithString:tempString];

         NSLog(@"string1 is %@",string1);

     2、使用一个C语言的字符串通过init方法赋值给我们新创建的NSString字符串

         NSString *string2 = [[NSString alloc] initWithCString:"i am pig"encoding:NSUTF8StringEncoding];

         NSLog(@"string2 is %@",string2);

     3、通过格式化赋值给我们新创建的NSString字符串(有一个拼接的作用)

         NSString *string3 = [[NSString alloc] initWithFormat:@"%@ %@",@"i am",tempString];

         NSLog(@"string3 is %@",string3);

         NSString *string4 = [[NSString alloc] initWithFormat:@"%@",@"我是好人"];

2、NSString的所有方法

     A、使用类方法创建OC字符串(这个才是我们常用的创建方法)

    1、使用字符串直接赋值

        NSString *tempString = @"hello";

        NSString *string5 = [NSString stringWithString:tempString];

        NSLog(@"string5 is %@",string5);

    2、使用C语言字符串赋值

        NSString *string6 = [NSString stringWithCString:"我爱你" encoding:NSUTF8StringEncoding];

        NSLog(@"string6 is %@",string6);

        NSString *string7 = [NSString stringWithFormat:@"我是%@",@"猪"];

        NSLog(@"string7 is %@",string7);        

    B、字符串的拼接

        NSString *string8 = @"你好";

        NSString *string9 = @"北京";

        NSString *catString = [NSString stringWithFormat:@"%@,%@",string8,string9];

        NSLog(@"catString is %@",catString);        

        NSString *catSecondString =[catString stringByAppendingString:@"我来了"];

        NSLog(@"catSecondString is %@",catSecondString);      

        NSString * catSecondString2=[NSString stringWithFormat:@"今天天气不错"];

        NSString *catSecondString3= [catSecondString2 stringByAppendingString:@"我们不上课"];

        NSLog(@"catSecondString3 %@",catSecondString3);        

    C、字符串长度

        NSString *aString = @"收拾收拾";

        NSInteger stringLength = [aString length];

        NSLog(@"astring 的长度是 %lu",stringLength);        

      D、判断字符串是否相等 关键词:isEqualToString,调用这个方法的是一个字符串对象,参数也是一个字符串对象,返回值是一个BOOL值(YES/NO),所谓bool值就是int值,可以用%d打印

        NSString *first = @"我2";

        NSString *second = @"我2";

        BOOL isEqual = [first isEqualToString:second];

        NSLog(@"%d",isEqual);

      E 、字符串比较 关键词compare,

        NSString *string1 = @"我是羊";

        NSString *string2 = @"我是羊";

        int result = [string1 compare:string2];

        NSLog(@"%d",result);

        

            E.a不区分大小写的字符串比较 关键词compare: options:

        NSString *str1 = @"abcd";

        NSString *str2 = @"ABCD";

        int result = [str1 compare:str2 options:NSCaseInsensitiveSearch];

        NSLog(@"%d",result);

        

      F、大小写转换

        NSString *str1 = @"abcd";

        NSString *uperStr = [str1 uppercaseString];//小写转大写

        NSLog(@"\nuper is %@ \nolder is %@",uperStr,str1);

        

        NSString *str2 = @"ABCD";

        NSString *lowerStr = [str2 lowercaseString];//大写转小写

        NSLog(@"\nlower is %@ \nolder is %@",lowerStr,str2);

        

        NSString *str3 = @"sAfdnl";

        NSString *capStr = [str3 capitalizedString];//首字母大写

        NSLog(@"\ncap is %@ \nolder is %@",capStr,str3);

        

      G、字符串查找

        NSString *str = @"我们都是大好人,大好人,大好人。";

     G.a  接下来我想查找“大好人”上面字符串里面有没有

        NSRange range = [str rangeOfString:@"大好人"];//调用这个方法的是一个字符串对象变量,参数是想要查找的内容字符串,结果是在调用的字符串里面有没有,在哪儿有

        if(range.location == NSNotFound)//如果成功,说明没有

        {

            NSLog(@"没找着");

        }

        else

        {

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

        }

        //NSRange里面有两个变量,一个是位置index,一个是长度length. NSRange不是对象,是个结构体

        

     G.b 从后向前找

        NSRange range1 = [str rangeOfString:@"大好人" options:NSBackwardsSearch];

        NSLog(@"location is %d,lenth is %d",range1.location,range1.length);

        

     G.c 判断前后缀

        NSString *str = @"1234567890";

        //前缀 关键词hasPrefix

        BOOL isHave21 = [str hasPrefix:@"12"];

        if(isHave21 == YES)

        {

            NSLog(@"你赢了");

        }

        else

        {

            NSLog(@"你输了");

        }

        //后缀 关键词hasSuffix

        BOOL isHave09 = [str hasSuffix:@"90"];

        if(isHave09 == YES)

        {

            NSLog(@"找到了");

        }

        else

        {

            NSLog(@"木有怎么办");

        }

        

     H、字符串提取(截出来)

        NSString *str = @"123321234567";

          H.a 从头截起到某一个index(下标)该index不截

        NSString *topStr = [str substringToIndex:4];

        NSLog(@"%@",topStr);

         H.b 从某一个index截起,到最后为止,该index截

        NSString *endStr = [str substringFromIndex:8];

        NSLog(@"%@",endStr);

         H.c 截某一段,使用NSRange,location那个index截

//        NSString *rangeStr = [str substringWithRange:NSMakeRange(4, 4)];//制作一个NSRange使用NSMakeRange(location,length)

//        NSLog(@"%@",rangeStr);

//        

//        NSRange range = [str rangeOfString:@"1234"];

//        if(range.location == NSNotFound)

//        {

//            NSLog(@"什么也不干");

//        }

//        else

//        {

//            NSString *finalStr = [str substringWithRange:range];

//            NSLog(@"%@",finalStr);

//        }

3、NSMutableString的所有方法

 

        //NSMutableString在使用时最好不要直接赋值(=@“”),因为这个NSMutableString是可变字符串,他的内容应该都是append进去的

        

//        //alloc创建 Mutable的东西都要初始化

//        NSMutableString *mutableStr = [[NSMutableString alloc] initWithCapacity:0];//参数capacity后面写多少都不会报错,但是一般都先写0

//        

//        //类方法创建

//        NSMutableString *mutableStrClass = [NSMutableString stringWithCapacity:0];

        

        //增(赋值)

        /*

         1、创建可变字符串对象

         2、向这个对象进行添加

         */

        NSMutableString *str = [NSMutableString stringWithCapacity:0];//创建对象

        [str appendString:@"123"];//直接添加

        NSLog(@"%@",str);

        [str appendFormat:@"%d",11];//格式化添加

        NSLog(@"%@",str);

        [str insertString:@"我" atIndex:3];//向index的位置添加字符串

        NSLog(@"%@",str);

        

        //删(删的还是自己)

        [str deleteCharactersInRange:NSMakeRange(2, 3)];//删除可变字符串中的一个区间的字符串

        NSLog(@"%@",str);

        

        //改

        [str setString:@"abcdefg"];//全改

        NSLog(@"%@",str);

        

        [str replaceCharactersInRange:NSMakeRange(3, 2) withString:@"一二三四"];//把可变字符串中的一段改为第二个参数的字符串内容

        NSLog(@"%@",str);

 

三、数组、字典

1、NSArray的所有方法

        //OC的数组

        //1、数组里面只能存对象

        //2、同一个数组里面存的数据类型可以不同

        //3、数组里面存的是对象指针的集合

        

        //NSArray

        //创建 alloc

        

        //initWithObjects

        NSArray *array = [[NSArray alloc] initWithObjects:@"123",@"456",@"789", nil];

        //nil表示结束

        //数组里面存对象时,要判断是否为nil,否则容易出现奇怪的问题

        NSLog(@"%@",array);

        

        //initWithArray 用一个数组来初始化另一个数组

        NSArray *array1 = [[NSArray alloc] initWithArray:array];

        NSLog(@"array is %@",array1);

        

        //类方法

        NSArray *array2 = [NSArray arrayWithObjects:@"123",@"456",@"789", nil];

        NSArray *array3 = [NSArray arrayWithArray:array2];

        

        //获取数组的元素

        NSString *str1 = [array2 objectAtIndex:1];

        NSLog(@"%@",str1);

        

        //练习,从数组@[@"我是人",@"你也是",@"他不是"];中取出index等于2的对象,并打印

        

        //练习 从数组@[@"我是人",@"你也是",@"他不是"];中取出index等于3的对象,并打印

        

        //要注意越界的问题

        

        //练习 从数组@[@"我是人",@"你也是",@"他不是"];中取出所有对象,并依次打印

        

        NSArray *array8 = [NSArray arrayWithObjects:@"我是人",@"你也是",@"他不是", nil];

        NSString *str5 = [array8 objectAtIndex:0];

        NSString *str6 = [array8 objectAtIndex:1];

        NSString *str7 = [array8 objectAtIndex:2];

        NSLog(@"%@\n %@\n %@",str5,str6,str7);

        

        for(int i = 0;i<3;i++)

        {

            NSLog(@"%@",[array8 objectAtIndex:i]);

        }

        

        //数组的长度

        int arrCount = [array8 count];

        NSLog(@"%d",arrCount);

        

        for(int i =0;i<[array8 count];i++)

        {

            NSLog(@"%@",[array8 objectAtIndex:i]);

        }

        

        //练习,从@[@"1",@"2",@"3"]中取出所有对象,并打印。要求分别使用遍历和不遍历的方法写,遍历时候不许用.count和[下标]

        

        //遍历@[@"i",@"k",@"f"];

        //使用i<count

        NSArray *arr1=[[NSArray alloc] initWithObjects:@"i",@"k",@"f", nil];

        for(int i=0;i<[arr1 count];i++)

        {

            NSLog(@"%@",[arr1 objectAtIndex:i]);

        }

        

        //for in

        for(NSString *temp in arr1)

        {

            NSLog(@"%@",temp);

        }

        

        //练习 使用for in 来遍历@[@"a",@"b",@"c"];

        

        

        //分割字符串

        NSString *s1 = @"i am a people";

        NSArray *arr10 = [s1 componentsSeparatedByString:@" "];

        NSLog(@"%@",arr10);

        NSString *newStr = [NSString stringWithFormat:@"%@%@%@%@",[arr10 objectAtIndex:0],[arr10 objectAtIndex:1],[arr10 objectAtIndex:2],[arr10 objectAtIndex:3]];

        NSLog(@"%@",newStr);

        

        NSMutableString *s2 = [NSMutableString stringWithCapacity:0];

//        for(NSString *temp in arr10)

//        {

//            [s2 appendString:temp];

//        }

        for(int i = 0;i<[arr10 count];i++)

        {

            [s2 appendString:[arr10 objectAtIndex:i]];

        }

        NSLog(@"%@",s2);

        

        //练习 有电话号码 133-3333-3333,变成1333333333

        

        //1(333·) 333 3333

        

        //componentsSeparatedByString

        //1(333·)3333333

        //1333·)3333333

        //1333·3333333

        //13333333333

        

        //同时切很多

        NSString *tel = @"1(333·) 333 3333";

        NSArray *telArr = [tel componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"(·) "]];//传入要切的字符集合

        

        NSMutableString *s3 = [NSMutableString stringWithCapacity:0];

        for(int i = 0;i<[telArr count];i++)

        {

            if([[telArr objectAtIndex:i] isEqualToString:@""] == NO)//因为用set方法切出来的数组里会有垃圾@""的存在,所以需要判断一下每一个索引的内容是否为垃圾@""

            {

                [s3 appendString:[telArr objectAtIndex:i]];

            }

        }

        NSLog(@"%@",s3);

        NSLog(@"%@",telArr);

        

        //练习,<aaaa bbbb cccc dddd 1111>,截出来aaaabbbbccccdddd1111,提示笨办法,先切“ ”,再切(,再切)。简单的用set方法直接把@“”、(、)一起切了,要求打印切完的数组和切好的字符串

        

        NSString *tokenStr = @"<aaaa bbbb cccc dddd 1111>";//创建字符串

        NSArray *tokenArr = [tokenStr componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<> "]];//设置要切的字符集合,并切

        NSMutableString *tokenSubedStr = [NSMutableString stringWithCapacity:0];//可变字符串

        for(int i = 0;i<[tokenArr count];i++)//遍历

        {

            if([[tokenArr objectAtIndex:i]isEqualToString:@""] == NO)//判断是否垃圾

            {

                [tokenSubedStr appendString:[tokenArr objectAtIndex:i]];//拼截字符串

            }

        }

        NSLog(@"%@",tokenArr);

        NSLog(@"%@",tokenSubedStr);

        

        //练习 把“2014年6月20日 12:12:22”,切成2014620121222

        //1、声明字符串

        NSString *timeStr = @"2014年6月20日 12:12:22";

        //2、开切

        NSArray *timeArr = [timeStr componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"年月日: "]];

        //3、可变字符串创建

        NSMutableString *subOverStr = [NSMutableString stringWithCapacity:0];

        //4、遍历

        for(int i =0;i<[timeArr count];i++)

        {

            //5、判断垃圾

            if([[timeArr objectAtIndex:i] isEqualToString:@""] == NO)

            {

                //6、拼接

                [subOverStr appendString:[timeArr objectAtIndex:i]];

            }

        }

        //7、打印

        NSLog(@"%@",timeArr);

        NSLog(@"%@",subOverStr);

        

        //练习 有一个网络返回值:“作者:罗宾汉.大卫”,需求是我们只显示姓:作者:大卫

        NSString *author = @"作者:罗宾汉.大卫";

        NSArray *cutArr = [author componentsSeparatedByString:@"."];

        NSString *overStr = [NSString stringWithFormat:@"作者:%@",[cutArr objectAtIndex:[cutArr count]-1]];

        NSLog(@"%@",overStr);

        

        //练习 把@“作者:罗宾汉.大卫”的名截出来

        NSString *name = @"作者:罗宾汉.大卫";

        NSArray *arrTemp = [name componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@":."]];

        NSMutableString *tempStr = [NSMutableString stringWithCapacity:0];

        

        [tempStr appendString:[arrTemp objectAtIndex:1]];

 

2、NSMutableArray的所有方法

 

        //可变数组 NSMutableArray

        

        //创建方法

        NSMutableArray *mutableArr = [NSMutableArray arrayWithCapacity:0];//类方法创建

        NSLog(@"%@",mutableArr);

        //增删改

        //增,向数组里添加新的对象

        

        //add增加,向数组的最后一位增加,依次

        [mutableArr addObject:@"hello"];

        NSLog(@"%@",mutableArr);

        [mutableArr addObject:@"world"];

        NSLog(@"%@",mutableArr);

        

        //insert,向数组中某一位添加新对象

        [mutableArr insertObject:@"my" atIndex:1];

        NSLog(@"%@",mutableArr);

        

//        //删

//        //删除某一个索引的对象

//        [mutableArr removeObjectAtIndex:1];//需要判断是否越界

//        

//        //删除最后一位

//        [mutableArr removeLastObject];

//        

//        //一下删光,清空

//        [mutableArr removeAllObjects];

//        NSLog(@"%@",mutableArr);

        

        //改

        [mutableArr replaceObjectAtIndex:1 withObject:@"your"];

        NSLog(@"%@",mutableArr);

        

        //练习,有一个列表,列表里面有很多行, 一个人的名字,

        //依次是@"A"、@"B", --------------add::结果::A,B

        //然后又多了两个人名:@"C"、@"D",----------add::结果::A,B,C,D

        //然后C不见了,--------remove index::结果::A,B,D

        //然后A和B之间多了一个E, --------insert::结果::A,E,B,D

        //再然后B改名了变成了F, --------replace::结果::A,E,F,D

        //最后把数组清空 ---------removeall

        //每完成一步都打印一下,看看结果

        

        //练习,首先有一个可变数组,

        //1、向里面添加两个字符串@“1”,@“2”,

        //2、变成@“1”,@“4”,@“2”

        //3、变成@“5”,@“4”,@“2”

        //4、变成@“5”,@”4“

        NSMutableArray *arrNum = [NSMutableArray arrayWithCapacity:0];

        [arrNum addObject:@"1"];

        [arrNum addObject:@"2"];

        [arrNum insertObject:@"4" atIndex:1];

        [arrNum replaceObjectAtIndex:0 withObject:@"5"];

        [arrNum removeObjectAtIndex:2];

        //[arrNum removeLastObject];

        NSLog(@"%@",arrNum);

        

        [arrNum addObject:@"1"];

        [arrNum addObject:@"10"];

        [arrNum addObject:@"6"];

        //5,4,1,10,6

        

        //交换位置

        NSLog(@"%@",arrNum);

        [arrNum exchangeObjectAtIndex:1 withObjectAtIndex:4];//把前后两个参数的index位置的对象交换

        NSLog(@"%@",arrNum);

        

        //排序

        //冒泡

        for(int i = 0;i<[arrNum count]-1;i++)

        {

            for(int j = 0;j<[arrNum count]-1-i;j++)

            {

                if([[arrNum objectAtIndex:j] compare:[arrNum objectAtIndex:j+1] options:NSCaseInsensitiveSearch]<0)

                {

                    [arrNum exchangeObjectAtIndex:j withObjectAtIndex:j+1];

                }

            }

        }

        NSLog(@"%@",arrNum);

        

        //现在有一个数组是

        NSArray *arrhere = [NSArray arrayWithObjects:@"4",@"6",@"2",@"8",@"1", nil];

        //要进行排序

        //思路,把NSArray 变成NSMutableArray,当要对对象本身进行修改时,要把对象转为可变的类型

        //创建一个Mutable的数组

        NSMutableArray *mutableArrHere = [NSMutableArray arrayWithCapacity:0];

    

        for(int i = 0;i<[arrhere count];i++)

        {

            [mutableArrHere addObject:[arrhere objectAtIndex:i]];

        }

        //然后对这个可变的数组进行排序

    }

 

 

3、NSDictionary的所有方法

 

           //什么是字典

            //字典是有索引的,每一个索引都对应一个内容

            //       key                    value

            //OC字典的核心就是key&value

        

        //NSDictionary NSMutableDictionary

        

        //NSDictionary

        //字典是无序的

        //alloc 创建

        NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"V1",@"K1", nil];

        //字典都是由一对对象组成的,这一对对象前者是value,后者是key,key是字符串,value是任意对象

        NSLog(@"%@",dic);

        //打印出来的字典由{}包围,{}里面是key = value的格式

        

        NSDictionary *dic1 = [[NSDictionary alloc] initWithDictionary:dic];

        

        //类方法 创建 key不要重复

        NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"虾条",@"零食",@"面条",@"主食",@"手抓肉",@"炒菜",@"二锅头",@"饮料", nil];

        NSDictionary *dic3 = [NSDictionary dictionaryWithDictionary:dic2];

        

        //找到对应key的value

        //关键词是objectForKey:参数是key,返回值是对应key的value,value是什么类型的对象,返回值就是什么类型的返回值

        NSString *mainFood = [dic2 objectForKey:@"主食"];

        NSLog(@"%@",mainFood);

        

        NSString *drink = [dic2 objectForKey:@"饮料"];

        

        //遍历,遍历数组直接就遍历那些对象。字典遍历的时候不是value,遍历的是key

        NSArray *dicArr = [dic2 allKeys];//通过allKeys可以找到一个字典里面的所有的key,返回值是一个数组

        for(int i = 0;i<[dicArr count];i++)

        {

            NSLog(@"%@",[dicArr objectAtIndex:i]);

        }

        

        //练习,有一个字典@[@"a":@"A",@"b":@"B",@"c":@"C",@"d":@"D"]

        //先创建出来,

        //找到c这个key对应的value

        //遍历这个字典,查找是否有d这个key,如果有,打印他的value

        

        NSDictionary *charDic = [NSDictionary dictionaryWithObjectsAndKeys:@"A",@"a",@"B",@"b",@"C",@"c",@"D",@"d", nil];

        NSLog(@"%@",[charDic objectForKey:@"c"]);

        

        NSArray *charDicArr = [charDic allKeys];

        for(NSString *tempStr in charDicArr)

        {

            if([tempStr isEqualTo:@"d"])

            {

                NSLog(@"%@",[charDic objectForKey:tempStr]);

            }

            else

            {

                NSLog(@"这个不是");

            }

        }

 

4、NSMutableDictionary的所有方法

 

        //NSMutableDictionary

        //创建

        NSMutableDictionary *mutableDic = [NSMutableDictionary dictionaryWithCapacity:0];

        

        //增添加新的key和value

        [mutableDic setValue:@"china" forKey:@"country"];

        [mutableDic setValue:@"北京" forKey:@"province"];

        

        //删除

        [mutableDic removeObjectForKey:@"country"];

        

        [mutableDic removeAllObjects];

        

        //练习

        //建一个可变字典

        NSMutableDictionary *peopleDic = [NSMutableDictionary dictionaryWithCapacity:0];

        //set两个value&key(name:lucy,age:16)

        [peopleDic setObject:@"lucy" forKey:@"name"];

        [peopleDic setObject:@"16" forKey:@"age"];

        //根据age找到value

        NSLog(@"%@",[peopleDic objectForKey:@"age"]);

        //添加一个value&key(sex:female)

        [peopleDic setObject:@"female" forKey:@"sex"];

        //删除一个value&key(name)

        [peopleDic removeObjectForKey:@"name"];

        //全删

        [peopleDic removeAllObjects];

        

        //数组、字典里面的内容不光是字符串(NSString),而可能是所有的对象类型

        NSMutableArray *tableArr = [NSMutableArray arrayWithCapacity:0];

        for(int i = 0;i<5;i++)

        {

            NSDictionary *hereDic = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"age is %d",arc4random()%100],@"age",[NSString stringWithFormat:@"sex is %d",arc4random()%1],@"sex",[NSString stringWithFormat:@"height is %d",arc4random()%200],@"height", nil];

            [tableArr addObject:hereDic];

        }

        NSLog(@"%@",tableArr);

        NSLog(@"age is %@",[[tableArr objectAtIndex:1] objectForKey:@"age"]);

    }

 

 

四、继承、类别、点语法

1、什么是继承?

 

//OC中的继承

//  定义了一个FlyCar类, 这个类继承与Car类

//  称呼:     子类, 父类

//  特性: 子类会拥有父类的属性和方法

@interface FlyCar : Car

//  Fly类中拥有父类Car类中speed,weight,move,load

{

    double _flySpeed;

}

@property double flySpeed;

 

//拥有汽车没有能力, 飞行

 

-(void)fly;

 

@end

 

 

总结: (1)OC每个类必须有个父类

如果你不知道要继承那个类, 继承NSObject

NSObject称为根类, 其他类都会直接或者

间接的继承这个类

扩展: xcode早期版本上(4.2)(不加父类不会报错)

 

(2)OC中一个类能不能继承与多个类??? (多继承)

 

OC中一个类只能继承与一个类, 

不能继承与多个类       (C++可以多继承)

(3) 自定义init方法

 

2、如何创建一个子类

 

//OC每个类只需要初始化自己的实例变量

//  实现子类的时候, 因为子类中包含了父类的实例变量

//  所以子类中一定执行父类的init方法

-(id)init

{

    //self是方法隐藏的参数

    //  self存储的是当前对象的地址

    //  Car *car = [[Car alloc] init];

    //      实例方法中: self的值就是car指针的值

    //  self什么时候使用

    //      (1)调用当前类的方法

    //          [self print];

    //      (2)使用property

    //          self.name = @"xiaoli";

    

    //super是编译器的指示符

    //  表示父类

    //  用法: 执行从父类中继承下来的方法

    

    if(self = [super init])

    {

        NSLog(@"Car init");

    }

    return self;

}

 

3、继承有什么用

 

继承(修改方法、也可以增加)

4、如何创建一个类别

 

5、类别有什么用

 

 

类别(增加方法)

 

6、类别和继承有什么区别

 

7、点语法如何实现

 

 

 

 

8、点语法的修饰符有哪些,都是什么意思(所有的修饰符)

 

五、封装、复合

1、理解封装和复合的概念

 

 

 

六、单例、NSData、文件

1、什么是单例

 

 

 

..

0//第一步 声明一个全局静态变量(这个类的对象)

static Sign *single=nil;

@implementation Sign

//第二步 实现+方法

+(id)shareInstance

{//第三步 做一个局部静态变量 是dispatch_once_t的类型的

    static dispatch_once_t onceTaken;

    //第四步 执行dispatch_once方法,第一个参数是上面的onceTaken的地址,第二个参数是这么写的^{},在大括号里面实现全局静态变量的alloc方法,并在alloc方法后面加分号。

    dispatch_once(&onceTaken,^{

        single=[[Sign alloc]init];

        single.isSign = @"yes";

    });

    //第五步 最后将静态全局变量return

    return single;

 

 

 

3、NSData与字符串、数组、字典的相互转换    

 

        //NSData 数据类 用在本地缓存、网络请求 NSData就是一个二进制

        //1、NSString with NSData

//        NSString *str = @"我是一个中国人";

//        //把NSString转换为NSData  

//        NSData *strData = [str dataUsingEncoding:NSUTF8StringEncoding];

//        NSLog(@"%@",strData);

//        

//        //把NSData转换为NSString

//        NSString *backStr = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];

//        NSLog(@"back str is %@",backStr);

//        

//        NSString * myStr=@"又是你";

//        NSData * myData=[myStr dataUsingEncoding:NSUTF8StringEncoding];

//        

//        NSString * myStr2=[[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

//        NSLog(@"%@  %@",myData,myStr2);

//        //2、NSArray with NSData

//    NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4", nil];

//        //把NSArray 转为NSdata

//        NSData *arrData = [NSKeyedArchiver archivedDataWithRootObject:arr];

//        NSLog(@"%@",arrData);

 

//        //把NSData 转回NSArray

//        NSArray *backArr = [NSKeyedUnarchiver unarchiveObjectWithData:arrData];

//        NSLog(@"backArr is %@",backArr);

 

//        //3、NSdictionary with NSData

//        //把NSDictionary转成NSData

 

//        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"a",@"1",@"b",@"2", nil];

//        //创建一个可变Data

//        NSMutableData *dicData = [[NSMutableData alloc] init];

//        //把这个可变data加入到一个归档中,作为被写入的对象

//        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:dicData];

//        //进行归档操作,把dic转存进data中,使用对象-key的方法,key是为了以后能找到某一个确定对象用的,这里可以用不同的key存很多个对

                        象(参考可变字典setValue:ForKey:)

//        [archiver encodeObject:dic forKey:@"dic"];

//        //归档结束

//        [archiver finishEncoding];

//        NSLog(@"%@",dicData);

//        

//        //把NSData转回NSDictionary

//        //创建一个解归档的对象,这个对象初始化从一个NSData里面读数据

//        NSKeyedUnarchiver *unArchier = [[NSKeyedUnarchiver alloc] initForReadingWithData:dicData];

//        //使用这个解归档的对象来把data根据key找出对应的对象转回dic

//        NSDictionary *backDic = [unArchier decodeObjectForKey:@"dic"];

//        //结束解归档

//        [unArchier finishDecoding];

//        NSLog(@"backDic is %@",backDic);

//        

//        

//        NSDictionary *dicTest = [NSDictionary dictionaryWithObjectsAndKeys:@"lily",@"name", nil];        

//        NSMutableData *dicToData = [[NSMutableData alloc]init];      

//        NSKeyedArchiver *archiverTest = [[NSKeyedArchiver alloc]initForWritingWithMutableData:dicToData];        

//        [archiverTest encodeObject:dicTest forKey:@"test"];        

//        [archiverTest finishEncoding ];

//                

//        NSKeyedUnarchiver *unarchiverTest = [[NSKeyedUnarchiver alloc]initForReadingWithData:dicToData];   

//        NSDictionary * dataTodic =  [unarchiverTest decodeObjectForKey:@"test"];        

//        [unarchiverTest finishDecoding];

//        

//        NSLog(@"test %@",dicToData);

//        NSLog(@"test %@",dataTodic);

 

 

4、文件操作的所有方法

 

      //使用单例创建一个文件管理器的对象,defaultManager就是一个单例方法

        NSFileManager *fm = [NSFileManager defaultManager];

        

        //创建文件,一般来说先要判断文件是否存在

        ///Users/qianfeng/Desktop/是11.txt的路径

        //路径后面跟一个文件名,文件名要加上扩展名

        BOOL ifExist = [fm fileExistsAtPath:@"/Users/qianfeng/Desktop/14.txt"];

        NSLog(@"%d",ifExist);

        

        //当bool值为NO的时候,我们创建一个新的文件

        if(ifExist == NO)

        {

            //第一个参数就是想创建的文件的路径,路径里面要包括即将创建的文件的名字和扩展名

            BOOL ifCreateSuccess = [fm createFileAtPath:@"/Users/qianfeng/Desktop/14.txt" contents:nil attributes:nil];

            if(ifCreateSuccess == YES)

            {

                NSLog(@"成功");

            }

            else

            {

                NSLog(@"失败");

            }

        }

        

        //创建一个目录,第一个参数是路径

        BOOL isPathSuccess = [fm createDirectoryAtPath:@"/Users/qianfeng/Desktop/123/456" withIntermediateDirectories:YES attributes:nil error:nil];

        if(isPathSuccess)

        {

            NSLog(@"成功");

        }

        else

        {

            NSLog(@"失败");

        }

        

        //获取文件大小的方法

        NSDictionary *fileDic = [fm attributesOfItemAtPath:@"/Users/qianfeng/Desktop/14.txt" error:nil];

        NSLog(@"%@",fileDic);

        long long size = [fileDic fileSize];

        NSLog(@"%lld",size);

        

        //遍历文件夹

        //错误信息的对象,很多方法都会把这个对象的地址传进去,当某一个方法执行时出现问题了,就可以打印这个error,看看到底哪儿错了

        NSError *error = nil;

        

        //浅层遍历,只遍历我们给定的路径这个文件夹的根目录,error参数传的是地址,要加&

        NSArray *shallowArr = [fm contentsOfDirectoryAtPath:@"/Users/qianfeng/Desktop" error:&error];

        if(error)

        {

            NSLog(@"%@",error);

        }

        else

        {

            NSLog(@"%@",shallowArr);

            //找文件类型,原理就是遍历上面数组,判断扩展名

            for(NSString *fileName in shallowArr)

            {

                if([fileName hasSuffix:@".txt"])

                {

                    NSLog(@"%@",fileName);

                }

            }

        }

        //深层遍历,遍历我们给定路径文件夹的文件以及其子目录下的文件

        //把遍历出来的文件存到数组中

        NSArray *deepArr = [fm subpathsOfDirectoryAtPath:@"/Users/qianfeng/Desktop/123" error:&error];

        if(error)

        {

            NSLog(@"%@",error);

        }

        else

        {

            NSLog(@"%@",deepArr);

        }

        

        //文件的复制和移动

        NSArray *fileArr = [fm contentsOfDirectoryAtPath:@"/Users/qianfeng/Desktop/123/456" error:&error];

        if(error)

        {

            NSLog(@"%@",error);

        }

        else

        {

            NSLog(@"%@",fileArr);

        }

        //文件路径

        NSString *filePath = [NSString stringWithFormat:@"/Users/qianfeng/Desktop/123/456/%@",@"14.txt"];

        //文件目的路径

        NSString *toPath = [NSString stringWithFormat:@"/Users/qianfeng/Desktop/123/%@",@"14.txt"];

        //复制

//        BOOL isCopySuccess = [fm copyItemAtPath:filePath toPath:toPath error:&error];

//        if(isCopySuccess)

//        {

//            NSLog(@"成功");

//        }

//        else

//        {

//            NSLog(@"失败%@",error);

//        }

        //移动

        BOOL isMoveSuccess = [fm moveItemAtPath:filePath toPath:toPath error:&error];

        if(isMoveSuccess)

        {

            NSLog(@"成功");

        }

        else

        {

            NSLog(@"失败%@",error);

        }

        

        //以上内容是文件的操作,都要用到NSFileManager的单例对象

 

 

5、文件内容操作的所有方法

 

        //接下来是文件的内容的读写操作

        //打开一个文件,会有只读、只写、读写的三种方法

        //操作文件内容的类是NSFileHandle类

        NSFileHandle *file = [NSFileHandle fileHandleForUpdatingAtPath:@"/Users/qianfeng/Desktop/123/14.txt"];//fileHandleForUpdatingAtPath是读写

        //打开以后我们的文件偏移量在开始(光标),偏移量是0

        NSData *fileData = [file readDataOfLength:1];//读几个字节

        NSString *fileStr = [[NSString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];

        NSLog(@"%@",fileStr);

        //读了一次之后,咱们的文件偏移量就到了上次读过的下一个位置了

        NSData *fileData2 = [file readDataToEndOfFile];

        NSString *fileStr2 = [[NSString alloc] initWithData:fileData2 encoding:NSUTF8StringEncoding];

        NSLog(@"%@",fileStr2);

        //偏移量现在已经到了末尾了

        //写文件内容

        NSString *string1 = @"123456789";

        NSData *string1Data = [string1 dataUsingEncoding:NSUTF8StringEncoding];//转str到data

        [file writeData:string1Data];

        

        //现在偏移量在最后

        //移动偏移量光标到最开始

        [file seekToFileOffset:0];

        

        NSString *string2 = @"@#$%*&(";

        NSData *string2Data = [string2 dataUsingEncoding:NSUTF8StringEncoding];//转str到data

        [file writeData:string2Data];

 

七、Plist、归档(字典)

1、Plist文件的创建

 

 

 

 

 

2、plist文件的类型以及每一级的类型

 

 

 

 

3、如何把一个plist文件读出来

 

 

        //从一个内容为字典的plist文件中取回字典的内容

        NSDictionary *stringPlistDic = [NSDictionary dictionaryWithContentsOfFile:@"/Users/qianfeng/Desktop/Plist/Plist/String.plist"];

        //NSLog(@"%@",stringPlistDic);

        //打印name这个key的value

        //NSLog(@"%@",[stringPlistDic objectForKey:@"name"]);

        

        NSArray *stringPlistArr = [NSArray arrayWithContentsOfFile:@"/Users/qianfeng/Desktop/Plist/Plist/Arr.plist"];

        //NSLog(@"%@",stringPlistArr);

        

        NSDictionary *dic1 = [NSDictionary dictionaryWithContentsOfFile:@"/Users/qianfeng/Desktop/Plist/Plist/Dic.plist"];

        //NSLog(@"%@",dic1);

        //请大家用代码实现这个plist,用代码见这个dictionary

        

        //第一步,写pic对应的数组

        NSArray *picArr = [NSArray arrayWithObjects:@"XXX/pic1.png",@"XXX/pic2.png",@"XXX/pic3.png", nil];

        

        //第二步,完成mainData这个字典

        NSDictionary *mainDic = [NSDictionary dictionaryWithObjectsAndKeys:@"news",@"title",@"home",@"info",picArr,@"pic", nil];

        

        //第三步,完成整个字典

        NSDictionary *wholeDic = [NSDictionary dictionaryWithObjectsAndKeys:mainDic,@"mainData",@"1",@"status", nil];

        //NSLog(@"%@",wholeDic);

        

        //遍历整个字典,写出每一层是什么,有什么内容

        //1、已经有了一个dic1的字典

        //2、找到这个字典的根节点

        //3、找到根节点里面有多少个key

        NSLog(@"dic1这个字典的根节点里面一共有%d个key",[[dic1 allKeys] count]);

        //4、遍历每一个key所对应的内容,写出每一个key的内容是什么类型的

        NSLog(@"status这个key的内容是个字符串,mainData这个key的内容是个字典");

        //5、如果key的内容是字符串,那么直接打印这个key对应字符串的内容,如果是字典或数组,那么开始重复3的内容

        //我们这个字典两个key一个是status对应字符串,可以直接打印,另一个mainData是个字典,要重复第三条工作

        NSLog(@"status 这个key 的value是 %@",[dic1 objectForKey:@"status"]);

        //6、进行那些重复3的内容的工作

        //我们这个字典就是开始遍历mainData这个key

        //7、mainData这个字典有多少个key

        NSLog(@"mainData这个key 对应的字典里一共有 %d个key",[[[dic1 objectForKey:@"mainData"] allKeys] count]);

        //8、打印直接key对应字符串的value

        NSLog(@"mainData这个字典里title和info这两个key对应的value是字符串,pic这个key对应的value是数组");

        NSLog(@"title对应的value是%@",[[dic1 objectForKey:@"mainData"] objectForKey:@"title"]);

        NSLog(@"info对应的value是%@",[[dic1 objectForKey:@"mainData"] objectForKey:@"info"]);

        //9、继续循环查找那些是数组和字典的key

        NSLog(@"pic对应的value是%@这个数组",[[dic1 objectForKey:@"mainData"] objectForKey:@"pic"]);

        //10、最后一条具体的数据的话

        for(NSString*tempStr in [[dic1 objectForKey:@"mainData"] objectForKey:@"pic"])

        {

            NSLog(@"pic数组里面的元素有%@",tempStr);

        }

        

        //建一个plist文件,名字是plist

        //这个plist文件根是字典

        //为这个字典创建2个key,一个是status,一个是content

        //status这个key的对应value类型是string,value是1

        //content这个key的对应value类型是array

        //content这个key是数组,数组长度是4

        //数组里每一个元素的类型都是dic

        //数组里这些dic的结构都相同,都有title、info、pic这些key

        //title和info对应的value是字符串型,value自由发挥爱些啥写啥

        //pic的value类型是个数组

        //每个数组都有两个元素,分别是one1.png、one2.png

        

        //使用字典(plistDic)把这个plist文件读出来

        NSDictionary *plistDic = [NSDictionary dictionaryWithContentsOfFile:@"/Users/qianfeng/Desktop/Plist/Plist/plist.plist"];

        //请找到content这个key对应的value类型

        NSLog(@"content这个key对应的value类型是数组");

        //数组里面存的每一个元素都是什么类型

        NSLog(@"content这个key对应的value数组里面每一个元素都是字典");

        //我想找到content数组的第二个元素,用字典接

        NSArray *contentArr = [plistDic objectForKey:@"content"];

        NSDictionary *twoDic = [contentArr objectAtIndex:1];

        

        //我想找到content数组第三个元素的info内容

        NSLog(@"info的value是字符串类型的");

        //找到content这个key对应的value数组

        NSArray *contentArr1 = [plistDic objectForKey:@"content"];

        //在这个数组中找到第三个元素,是个字典

        NSDictionary *threeDic = [contentArr1 objectAtIndex:2];

        //在这个字典中找到info这个kei的value

        NSString *threeInfoStr = [threeDic objectForKey:@"info"];

        NSLog(@"threeInfoStr is %@",threeInfoStr);

        

        //练习 找到数组中第一个元素的title这个key的value

        

        //练习:做一个plist(ArrPlist.plist),根是数组

        //数组有两个元素,每一个元素都是字典

        //字典有三个key,一个是name,一个tel,一个是headView

        //找到lily的联系方式,遍历数组,然后isequaltostring:lily,然后nslog该index的tel

        NSArray *contactArr = [NSArray arrayWithContentsOfFile:@"/Users/qianfeng/Desktop/Plist/Plist/ArrPlist.plist"];

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

            if([[contactArr[i] objectForKey:@"name"] isEqualToString:@"lily"]){

                NSLog(@"%@",[contactArr[i] objectForKey:@"tel"]);

                break;

            }

        }

        for(NSDictionary *tempDic in contactArr){

            if([[tempDic objectForKey:@"name"] isEqualToString:@"lily"]){

                NSLog(@"%@",[tempDic objectForKey:@"tel"]);

            }

        }

    }

 

 

 

6、如何把一个字典赋值给一个类的所有属性

 

/        //<1>系统对象归档

//        NSString *info=@"jin ri ni ke an hao?";

//        NSArray *arr=[[NSArray alloc]initWithObjects:@"shengming",@"aiqing",@"ziyou",@"douyu", nil];

//        

//        //对象归档archiver

//        //NSKeyedArchiver 专门用于对象归档的类

//        // 第二个参数,应该填入一个归档文件的路径

//        NSString *path=@"/Users/qianfeng/Desktop/info.data";

//        BOOL b=[NSKeyedArchiver archiveRootObject:info toFile:path];

//        if (b) {

//            NSLog(@"archiver OK");

//        }

//        

//        //<2>把对象从归档文件中读取出来 ----解档

//        NSString *readInfo =[NSKeyedUnarchiver unarchiveObjectWithFile:path];

//        NSLog(@"readdInfo=%@",readInfo);

        

        

//        //自定义对象的归档和解档(重点,难点)

//        Dog *dog=[[Dog alloc]init];

//        dog.name = @"xiaoHa";

//        dog.age = 3;

//        

//        //把这个狗---归档

//        NSString *path=@"/Users/qianfeng/Desktop/dog.data";

//        [NSKeyedArchiver archiveRootObject:dog toFile:path];

//        

//        //考虑问题:  系统的对象为什么能直接归档?

//        //要想让自己定义的对象支持归档和解档

//        //  需要做两件事情:

//        //  (1)遵守 NSCoding 协议

//        //  (2)实现协议中的两个方法

//        //- (void)encodeWithCoder:(NSCoder *)aCoder;

//        //- (id)initWithCoder:(NSCoder *)aDecoder;

//        

//        //从文件中---解档出来这条狗

//        Dog *newDog=[NSKeyedUnarchiver unarchiveObjectWithFile:path];

//        NSLog(@"name=%@,age=%d",newDog.name,newDog.age);

        

 

 

7、6需要注意什么事项

 

 

 

 

八、协议、NSDate

1、如何创建一个协议

 

 

//一个协议由

/*

@protocol Work <NSObject>

 

@end

组成

 

@protocol是协议的名字的提示符

 

Work就是一个协议名 

 

<NSObject>跟在协议名的后面

 

@end是一个协议的结束

 

在protocol和end之间添加协议方法

*/

@protocol Work <NSObject>

 

-(void)drink;

 

@end

 

//协议创建完成,等待他人遵守

 

 

2、协议有哪些分类

 

 

//当一个协议是@optional的时候,我们又称这个协议是非正式协议

@protocol Play <NSObject>

@required//这个表示表示他下面的方法是必须实现的,默认一个协议就是@required

-(void)sleep;

 

@optional//这个标示表示他下面的方法是可选择实现的

-(void)wakeUp;

 

3、如何遵守一个协议

 

#import "Work.h"//包含协议的头文件

#import "Play.h"

#import "DicManager.h"

 

@interface Test : NSObject<Work,Play,DicManager>//在父类后用<>包含一个协议的协议名,表示我们现在这个类将遵守这个协议的内容,当遵守多个协议的时候,协议之间用逗号分隔

 

-(void)eat;

 

4、遵守了以后干嘛

 

 

 

九、内存管理

1、内存管理管的是什么

     //用一句话说,OC的内存管理,管理的是内存的引用计数(retainCount)

 

 

 

2、内存管理怎么管的

 

        //OC的内存管理分为两种,一种是手动内存管理(MRC),一种是自动内存管理(ARC)

        

 

3、内存管理的体现是什么

 

    //任何一个对象都可以调用retainCount方法来查看他目前的引用计数,当更多还是要脑算

        

        //现在str所指向的内存当使用了alloc的时候,每次引用计数+1,所以现在str所指向的内存的引用计数是1

        

        //当对一个对象进行了retain操作以后,这个对象指向的内存的引用计数会+1,所以现在str指向的内存的引用计数是2

        

        //当一个对象指针所指向的内存空间的引用计数大于0时,我们认为这块内存是可以被引用的,

        //当一个对象指针所指向的内存空间的引用计数等于0之后,这块内存空间就会自动调用他的dealloc方法进行释放(这个操作不需要我们管理)

        

        //当使用alloc,copy、new、retain这些方法的时候,一块内存的引用计数会进行+1操作

        //当使用release操作的时候,一块内存的引用计数会进行-1操作

 

4、内存管理需要注意的事项

 

 

   //注意:从来不要直接调用[对象 dealloc];

    

    //思考:alloc release dealloc

    //release和dealloc有什么区别,哪个释放内存

    /*

        1、release和内存释放没有直接关系,release的工作是计数-1

        2、dealloc才是释放内存,计数为0的时候自动调用

    */

    

 

十、代理

1、代理有一个触发类和一个接受类

 

2、如何创建一个触发类(协议、属性、方法)

 

3、如何实现一个触发类(方法、属性调用协议方法)

 

4、如何创建一个接受类

 

5、如何实现一个接受类

 

6、接受类是如何与触发类联系的,需要注意什么(修饰符)