一、类和对象
1.定义:类是具有相同特征和行为的事物的抽象,对象是类的具体化,类是对象的类型。
2.面向对象的三大特性:封装,继承,多态。
3.类对象的关系
类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。
4.类类型的声明
class 类名
{
public:
公用的数据和成员函数
protected:
保护的数据和成员函数
private:
私有的数据和成员函数
};
5.定义对象方法
1.先声明类类型,然后再定义对象
2.在声明类类型的同时定义对象
二、继承和初始化
1.为单一实例变量赋值的方法叫setter方(设置器) //setter方法:-号方法,无返回值,set开头加上对应实例变量的名字(首字母大写)有且只有一个参数,参数的类型和实例变量的类型相同,参数名和实例变量的名相同
2.获取单一实例变量的值的方法叫getter方法(访问器) //getter方法:-号方法,有返回值,返回值类型和实例变量类型相同,方法名get +实例变量名(首字母大写),无参数
3.继承的优势:其实就是省代码,增强程序的可扩展性和可修改性.
4.继承的上层:父类,下层:子类
5.继承具有单向性:只有单向传递,如果a作为b的父类,a就不能再成为b的子类.
6.继承具有传递性:c继承于b,b继承于a
4.子类继承父类的全部实例变量和方法
5.子类从父类继承过来的内容就是自己的,只不过来源于父类
原则:当多个类中出现部分相同的特征和行为时,可以将相同部分写成一个父类,其他类继承即可.
6.自定义初始化方法的声明 -号方法
- (instancetype)initWith方法名:(参数类型)参数名
例如:- (instancetype)initWithName:(NSString *)name; .h
- (instancetype)initWithName:(NSString *)name{
self = [super init];
if (self) {
_name = name; }
return self; } .m
7.便利构造器 +号方法 调用类方法,因为调用的是类方法,没有进行分配空间初始化,所以在内部把对象进行初始化,返回对象。
+ (类名 *) (init用小写类名代替)With方法名:(参数类型)参数名
例如:+ (Person*)personWithName:(NSString *)name;
+ (Person*)personWithName:(NSString *)name{
Person *per = [[Person alloc] initWithName:name];
return per;
}
三、属性
1.是oc2.0版本定义的语法.提供了setter,和getter方法的默认实现,在一定程度上提高了我们的代码效率.并且提高程序的安全性.
2.属性的声明:在.h里使用@property声明属性.
//@property(readwrite,nonatomic) NSString *name;
3.在.h里声明setter和getter方法.
4.读写性控制:{
readonly:只读状态,告诉编译器,属性只生成getter方法,不生成setter方法
readwrite:读写状态,告诉编译器,我么即生成setter方法也生成getter方法,就是设置器和访问器都生成(默认的读写性)
}
5.原子特性:{
atomic:原子性,setter和getter方法在多线程下是完全安全的,即在setter和getter方法内对多线程的访问进行了处理,但是他的效率非常的低(默认的原子特性)
nomatic:非原子特性,getter和setter方法里内部不会堆多线程的访问进行处理,即这个setter和getter方法里只实现我们最基本的setter和getter方法(pass:这是我们最常用的原子特性)
}
6.语义设置{
如果我们定义的属性类型是基本类型:(int,float,char,NSInteger)我们都使用语义的设置是assign
如果我们定义的属性类型是对象类型:(person *per)
字符串类型我们用的语义设置是copy
其他类型我们用的语义设置是retain
}
四、字符串
1.字符串的创建.
第一种方式
char a[] = "lanOu";
initWithUTF8String将c语言里的字符串转换为oc里的字符串
NSString *string1 = [[NSString alloc]initWithUTF8String:a];
NSLog(@"%@",string1);
第一种方式的便利构造器方法
NSString * string2 = [NSString stringWithUTF8String:a];
NSLog(@"%@",string2);
第二种方式:字面量
NSString *string3 = @"lanOu3g";//字面量(最常用的字符串创建方式)
NSLog(@"%@",string3);
第三种方式(最nb的创建方式)
NSString * string1 = [[NSString alloc]initWithFormat:@"hello lanou"];
NSLog(@"%@",string1);
NSInteger a = 18;
NSString *string2 = [[NSString alloc]initWithFormat:@"%ld",a];
NSLog(@"%@",string2);
int b = 20;
NSString *string3 = [NSString stringWithFormat:@"%d",b];
NSLog(@"%@",string3);
作用1.创建一个普通的字符串对象.
2.将别的类型的对象转换成字符串类型的对象.
3.字符串拼接.
NSInteger a = 10;
NSString *string = [NSString stringWithFormat:@"%@",@"heihei,小鸭梨"];
NSLog(@"%@",string);
NSString *string2 = @"是帅哥";
NSString *string3 = [NSString stringWithFormat:@"%@%@,是不是?,%ld",string,string2,a];
NSLog(@"%@",string3);
NSString *string =@"小红";
NSString *string2 = @"今年";
NSString *string3 = @"岁了";
NSInteger string4 = 8;
NSString *string5 = @"真逗比";
NSString *string6 = [NSString stringWithFormat:@"%@%@%ld%@%@,是不是?",string,string2,string4,string3,string5];
NSLog(@"%@",string6);
2.字符串长度.
NSString *string = [NSString stringWithFormat:@"lanOuDaLian"];
NSUInteger length = string.length;//无符号长整形
NSLog(@"%lu",length);
3.获取字符串中的字符
NSString *string = [NSString stringWithFormat:@"lanOuKeiJi"];//获取字符串对应字符的下标
unichar c = [string characterAtIndex:2];
NSLog(@"%c",c);//无符号短整型
4.判断字符串是否相等
NSString *string1 = @"heihei";
NSString *string2 = @"haha";
if([string1 isEqualToString:string2]){//判断调用对象和传入对象是否相等(判断内容是否相同)
NSLog(@"两个字符串相等");
}else{
NSLog(@"两个字符串不相等");
}
if( string1 == string2){//判断字符串的地址是否相同
NSLog(@"地址相同");
}else{
NSLog(@"地址不相同");
}
5.字符串比较
NSString *string1 = @"laoWang";
NSString *string2 = @"yaLi";
NSComparisonResult result = [string1 compare:string2];
NSLog(@"%ld",result);
switch (result){
case NSOrderedAscending:
NSLog(@"前小后大");
break;
case NSOrderedDescending:
NSLog(@"前大后小");
break;
default:
NSLog(@"相等");
break;
}
6.获取子字符串
NSString *string = @"lanOuDalian";
获取下标为5之前的字符.(不包含5)
NSString *string1 = [string substringToIndex:5];
NSLog(@"%@",string1);
截取下标为5之后的字符(包含5).
NSString *string2 = [string substringFromIndex:5];
NSLog(@"%@",string2);
截取从下标3开始长度为4的字符.
NSString *string3 = [string substringWithRange:NSMakeRange(3, 4)];
NSLog(@"%@",string3);
7.字符串拼接
NSString *string = @"大连";
NSString *string2 = [string stringByAppendingString:@"蓝欧"];
NSLog(@"%@",string2);
NSString *string3 = [string2 stringByAppendingFormat:@"%d",1233];
NSLog(@"%@",string3);
8.字符串替换
NSString *string = @"lanoudalian";
前面的a是我想要替换的字符串后面的b是我想要替换成的字符串,
NSString *string2 = [string stringByReplacingOccurrencesOfString:@"a" withString:@"b"];
NSLog(@"%@",string2);
9.字符串类型转换成其他类型
NSString *string1 = @"123";
将字符串转换成长整形
NSInteger a = [string1 integerValue];
NSLog(@"%ld",a);
NSString *string2 = @"18.9";
float b = [string2 floatValue];
NSLog(@"%f",b);
NSString *string3 = @"18";
int c = [string3 intValue];
NSLog(@"%d",c);
10.大小写转换
NSString *string = @"hello lanou";
(1)全部大写
NSString *upperString = [string uppercaseString];
NSLog(@"%@",upperString);
(2)全部小写
NSString *lowerStr = [string lowercaseString];
NSLog(@"%@",lowerStr);
(3)首字母大写
NSString *capitalStr =[string capitalizedString];
NSLog(@"%@",capitalStr);
11.判断开头结尾
NSString *string = @"http://www.lanou3g.com";
判断是否以http开头
BOOL isPrefix = [string hasPrefix:@"http"];
NSLog(@"%d",isPrefix);
12.插入字符串
[mStrinsertString:@"haha"atIndex:0];
NSLog(@"%@",mStr);
13.删除字符串
[mStrdeleteCharactersInRange:NSMakeRange(3,2)];
NSLog(@"%@",mStr);
14.替换字符串
[mStrreplaceCharactersInRange:NSMakeRange(3,2)withString:@"123"];
NSLog(@"%@",mStr);
15.重置字符串
[mStrsetString:@"heihei"];
NSLog(@"%@",mStr);
五.数组
系统提供的数组类:类似于c语言里的数组的功能
2.数组是一个大容器,数组里可以存储不同类型的对象,但必须要保证数组里存储的都是对象,
3.oc里提供了两类数组:一类是NSArray(不可变数组),一类是NSMutableArray(可变数组)
可变与不可变的区别;可变就意味着可以对原对象进行操作,不可变就意味着一旦创建,内容就不可变.
(1)使用初始化方法创建数组
NSArray *array1 = [[NSArray alloc]initWithObjects:@"徐冶",@"徐宝宝",@"冶宝宝",@"徐冶宝宝", nil];
NSLog(@"%@",array1);//(%@)对象类型的占位符
(2)使用便利构造器方法创建数组(最常用的方法)
NSArray *array = [NSArray arrayWithObjects:@"xuYe",@"xuBaoBao",@"yeBaoBao",@"xuYeBaoBao" ,nil];
NSLog(@"%@",array);
NSArray *haha = [NSArray arrayWithObjects:@"doubi",@"nihao", nil];
NSLog(@"%@",haha);
(3)字面量
NSArray *array = @[@"xuYe",@"haha",@"doubi",@"nihao"];
NSLog(@"%@",array);
4.数组元素的个数
NSUInteger count = array.count;
NSLog(@"%lu",count);
5.获取数组元素
NSString *name1 = [array objectAtIndex:0];
NSLog(@"%@",name1);
字面量取法
NSString *name2 = array[2];
NSLog(@"%@",name2);
NSString *name3 = [array firstObject];
NSLog(@"%@",name3);
NSLog(@"first = %@",name3);
NSString *name4 = [array lastObject];
NSLog(@"%@",name4);
6.当数组为空的时候,使用firstObject以及lastObject可以保证程序安全,不会崩溃,返回值是nil,但使用objectAtIndex:时,如果数组为空,则程序崩溃(不知道数组是否为0,用first或者last或者.count判断)
NSArray *nameArrayOne = [NSArray arrayWithObjects:@"Xuye",@"haha",@"haha",@"heieh", nil];
NSArray *nameArrayTwo = [NSArray arrayWithObjects:@"xiaoYaLi",@"daYaLi",@"yaLiBaoBao",@"xiaoYaLiBaoBao", nil];
7.查找haha对应的下标
NSUInteger index = [nameArrayOne indexOfObject:@"haha"];
NSLog(@"%lu",index);
8.断数组中是否包含某个对象(还可以判断是否收藏过,或者阅读过)
BOOL isTrue = [nameArrayOne containsObject:@"haha"];
NSLog(@"isTrue == %d",isTrue);
9.判断两个数组是否相等
BOOL isEqual = [nameArrayOne isEqualToArray:nameArrayTwo];
NSLog(@"isEqual == %d",isEqual);
NSString *string1 = @"123";
NSString *string2 = @"321";
if ([string1 isEqualToString:string2]){
NSLog(@"相等");
}else{
NSLog(@"不等");
}
NSArray和NSString之间的转换
NSString *string = @"www.lanou3g.com";(字符串到数组)
NSArray *array = [string componentsSeparatedByString:@"."];
NSLog(@"%@",array);
10.数组到字符串
NSArray *myArray = [NSArray arrayWithObjects:@"北京",@"大连",@"上海",@"广东",@"郑州",nil];
NSString *myString = [myArray componentsJoinedByString:@"&"];
NSLog(@"%@",myString);
11.Capacity容量
以下三种方式都是创建一个可变的空数组
NSMutableArray *myArray = [[NSMutableArray alloc]initWithCapacity:1];//(如果给1用完之后在开辟1个对象空间,如果给10用完之后再给10个对象空间如果给20用完空间之后再给开辟20个对象空间......以此类推);
NSMutableArray *youArray = [NSMutableArray arrayWithCapacity:1];
NSMutableArray *bigArray = [NSMutableArray array];//创建空数组
12.增加数据
addObject :在数组的最后面添加
[bigArray addObject:@"lanou"];
[bigArray addObject:@"dalian"];
[bigArray addObject:@"beijing"];
[bigArray addObject:@"beijing"];
NSLog(@"%@",bigArray);
13.在指定位置插入一个元素
[bigArray insertObject:@"heihei" atIndex:1];//(insert:插入,嵌入)
NSLog(@"%@",bigArray);
14.删除
(1).删除指定元素(只要是这个对象有多少删多少)
[bigArray removeObject:@"beijing"];
NSLog(@"%@",bigArray);
[bigArray removeObjectAtIndex:0];
NSLog(@"%@",bigArray);
(2).替换元素
[bigArray replaceObjectAtIndex:1 withObject:@"beijing"];
NSLog(@"%@",bigArray);
(3).交换指定位置的两个元素
[bigArray exchangeObjectAtIndex:0 withObjectAtIndex:1];
NSLog(@"%@",bigArray);
(4).删除全部
[bigArray removeAllObjects];
NSLog(@"%@",bigArray);
六、字典
1.字典具有一一对应的数据,它是无序的,取出的key和value是有序的,字典里的数据成对出现,值可以相同,但是key不可以相同,一个key一个value。
2.便利构造器方法
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"xiaoyali",@"name",@"nan",@"sex", nil];
NSLog(@"%@",dic);
NSDictionary *dic2 = @{@"name":@"xiaoyali",@"sex":@"nan"};
NSLog(@"%@",dic2);
3.求字典的元素个数
NSUInteger count = dic2.count;
NSLog(@"%lu",count);
4.将字典里所有的value放到一个数组里**********
NSArray *values = dic2.allValues;
NSLog(@"%@",values);
5.字典取值
NSString *name = [dic2 objectForKey:@"name"];
NSLog(@"%@",name);
NSString *sex = [dic2 objectForKey:@"sex"];
NSLog(@"%@",sex);
BOOL a = dic2.allKeys;
可变字典
NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"zhangsan",@"name",@"nan",@"sex", nil];
6.字典增加一个元素
[dic setObject:@"18" forKey:@"age"];
NSLog(@"%@",dic);
[dic setObject:@"jinzhou" forKey:@"city"];
NSLog(@"%@",dic);
7.修改名字为xiaoyali
[dic setObject:@"xiaoyali" forKey:@"name"];
NSLog(@"%@",dic);
8.setObject:forKey:工作原理:先查找字典里有没有对应key,如果有,则修改key对应的value,如果没有把key-value作为元素添加到字典里
[dic setObject:@"dalian" forKey:@"city"];
NSLog(@"%@",dic);
9.移除元素
[dic removeObjectForKey:@"city"];
NSLog(@"%@",dic);
10.移除所有元素
[dic removeAllObjects];
NSLog(@"%@",dic);
11.数组套数组
NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"11",@"222", nil];
NSMutableArray *array2 = [NSMutableArray arrayWithObjects:@"22",@"333",@"1234", nil];
NSMutableArray *array = [NSMutableArray array];
[array addObject:array1];
[array addObject:array2];
NSLog(@"%@",array);
12.便利构造器方法
NSMutableDictionary *dic1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"zhangsan",@"name",nil];
NSMutableDictionary *dic2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"lisi",@"name",nil];
[array addObject:dic1];
[array addObject:dic2];
NSLog(@"%@",array);
NSMutableDictionary *dic3 = array[3];
NSLog(@"%@",dic3);
创建一个空字典
NSMutableDictionary *myDic = [NSMutableDictionary dictionary];
[myDic setObject:array1 forKey:@"one"];
[myDic setObject:array2 forKey:@"two"];
NSLog(@"%@",myDic);
[myDic setObject:dic1 forKey:@"three"];
[myDic setObject:dic2 forKey:@"four"];
NSLog(@"%@",myDic);
七、集合
1.特点:无序性,互异性,本质上是一个大容器
NSSet *mySet = [[NSSet alloc]initWithObjects:@"aa",@"bb",@"cc",@"dd",@"aa",@"bb",@"bb",@"cc", nil];
NSLog(@"%@",mySet);
2.元素的个数
NSUInteger count = mySet.count;
NSLog(@"%lu",count);
3.获取集合里的元素
NSString *string1 = [mySet anyObject];
NSLog(@"%@",string1);
4.将集合里的元素取到一个数组里
NSArray *myArray = mySet.allObjects;
NSLog(@"%@",myArray);
可变集合
NSMutableSet *mySet = [[NSMutableSet alloc]initWithObjects:@"aa",@"bb", nil];
5.添加元素
[mySet addObject:@"cc"];
[mySet addObject:@"bb"];
NSLog(@"%@",mySet);
NSLog(@"%lu",[mySet count]);
6.移除元素
[mySet removeObject:@"aa"];
NSLog(@"%@",mySet);
八、内存管理
1.为什么本该引用计数为0的,为什么还是1,引用计数只是告诉系统是否需要回收空间,当最后一次release的时候,发现计数为1,就说明只有自己在使用,所以自己release之后直接回收空间即可,无需再将引用计数置0
2.过度释放
Person *per = [[Person alloc]init];
[per release];
[per release];
3.野指针
Person *per = [[Person alloc]init];
per.name= @"冶宝宝";
Person *per2 = per;
[per release];
NSLog(@"%@",per2.name);
4.内存泄露
Person *per1 = [[Person alloc]init];
Person *per2 = [[Person alloc]init];
per2 = per1;
NSString *string = @"lanou";
[string release];
[string release];
NSLog(r@"%lu",[string retainCount]);
5.满足什么条件才会引用计数的概念
(1).必须是oc的对象
(2).空间必须在堆区
(3).其他区的引用计数都是一个无限大的数
Person *per = [[Person alloc]initWithName:@"123"];
[per release];
6. copy
根据copyWithZone:方法的实现不同,拷贝分为三种类型:伪拷贝
浅拷贝深拷贝