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、接受类是如何与触发类联系的,需要注意什么(修饰符)

上一篇:nginx的监控配置


下一篇:大数据平台Docker应用之路