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

oc总结的更多相关文章

  1. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  2. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  3. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  4. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  5. WebViewJavascriptBridge源码探究--看OC和JS交互过程

    今天把实现OC代码和JS代码交互的第三方库WebViewJavascriptBridge源码看了下,oc调用js方法我们是知道的,系统提供了stringByEvaluatingJavaScriptFr ...

  6. OC泛型

    OC泛型 泛型是程序设计语言的一种特性,他主要是为了限制类型的,比如OC中的数组,你可以限制他里面装的是NSString类型,泛型的话JAVA和C++都有的,大家要是对泛型不了解的话可以去百度一下. ...

  7. iOS学习15之OC集合

    1.数组类 1> 回顾C语言数组 数组是一个有序的集合, 来存储相同数据类型的元素. 通过下标访问数组中的元素,下标从 0 开始. 2> 数组 数组是一个有序的集合,OC中的数组只能存储对 ...

  8. JS 与OC 交互篇

    完美记录交互 CSDN博客: (OC调用JS) http://blog.csdn.net/lwjok2007/article/details/47058101 (JS调用OC) http://blog ...

  9. OC中加载html5调用html方法和修改HTML5内容

    1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...

  10. iOS开发--JS调用原生OC篇

    JS调用原生OC篇 方式一(反正我不用) 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理. 我写了一个简单的HTML网页和一个btn点击 ...

随机推荐

  1. cf E. Fox and Card Game

    http://codeforces.com/contest/389/problem/E 题意:给你n个序列,然后两个人x,y,两个人玩游戏,x从序列的前面取,y从序列的后面取,两个人都想自己得到的数的 ...

  2. ISO-7816-1-2-3协议

    第一部分:卡的电气特性一. 卡的触点分配IC卡触点的分配遵循ISO7816-2的规定,如下所示: C1 电源电压(Vcc) C5 地(GND) C2 复位信号(RST) C6 不使用 C3 时钟信号( ...

  3. Android Task 相关

    在日常开发过程中,只要涉及到activity,那么对task相关的东西总会或多或少的接触到,不过对task相关的一些配置的作用一直理解的还不是很透彻,官方文档在细节上说的也不够清楚,要透彻理解还是得自 ...

  4. c++ explicit

    C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c++类 ...

  5. Data 语义学(1)

    一.Data Member 的绑定(The binding of Data Member) extern float x; class Point3d { public: Point3d( float ...

  6. 嵌入式设备web服务器比较

    目录(?)[-] Boa Thttpd Mini_httpd Shttpd Lighttpd Goahead AppWeb Apache 开发语言和开发工具 结论 备注   现在在嵌入式设备中所使用的 ...

  7. Unique Binary Search Trees——LeetCode

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  8. openSession和getCurrentSession的比较

    在比较openSession和getCurrentSession这两个方法之前,我们先认识一下这两个方法. 在进行配置信息管理时,我们一般进行一下简单步骤: Configuration cfg = n ...

  9. SPBF(队列优化的Bellman-Foord)

  10. PHP 生命周期,Opcode 缓存。

    1.php 执行的生命周期. 用户发出请求---->.php--->词典扫描--->解析--->创建Opcode--->处理opcode--->响应 这就是php的 ...