OC回顾

一、类和对象

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:方法的实现不同,拷贝分为三种类型:伪拷贝

浅拷贝深拷贝

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容