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