美文网首页
OC总结(2)

OC总结(2)

作者: 飞翔的鸵鸟 | 来源:发表于2016-02-23 10:42 被阅读63次

6.数组

系统提供的数组类:类似于C语言中的数组的功能

数组是一个大容器,数组中可以储存不同类型的对象,但必须要保证数组中储存的都是对象.

oc 中提供了两类数组:一类是NSArray(不可变数组) 一类是NSMutableArray(可变数组)

可变与不可变的区别:可变意味着可以对原有对象进行操作,不可变就意味着一旦创建,内容就不可改变

一.创建数组

1.使用初始化方法创建数组

NSArray *array = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", @"d", nil];

2.使用便利构造器方法创建数组

NSArray *array1 = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", nil];

3.字面量

NSArray *array2  = @[@"a", @"b", @"c", @"d"];

二.数组的使用

1.数组元素的个数

NSUInteger count = array.count;

2.获取数组元素

NSString *name1 = [array objectAtIndex:0];

字面量取法

NSString *name2 = array[2];

NSString *name3 = [array firstObject];

NSString *name4 = [array lastObject];

当数组元素为空的时候,使用firstObject以及lastObject可以保证程序安全,不会崩溃,返回值是nil,但使用objectAtIndex:时,如果数组为空,则程序崩溃.

NSArray *nameArrayOne = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", nil];

NSArray *nameArrayTwo = [NSArray arrayWithObjects:@"e", @"f", @"g", @"h", nil];

3.找某个对象对应的下标

NSUInteger index = [nameArrayOne indexOfObject:@"a"];    

4.数组中是否包含某个对象

BOOL isTrue = [nameArrayOne containsObject:@"a"];          

NSLog(@"isTrue == %d", isTrue);

5.判断数组是否相等

BOOL isEqual = [nameArrayOne isEqualToArray:nameArrayTwo];

NSLog(@"isEqual == %d", isEqual);

6.NSArray和NSString之间的转换

(1)字符串到数组

NSString *string = @"www.jianshu.com";

NSArray *array = [string componentsSeparatedByString:@"."];  // 以.进行分割

(2)数组到字符串

NSArray *myArray = [NSArray arrayWithObjects:@"北京", @"大连", @"上海", @"广东", @"郑州", nil];

NSString *myString = [myArray componentsJoinedByString:@"&"];  // 以&将数组中的对象连成一个字符串

三.可变数组

1.创建(3种方式)        

 initWithCapacity:    预先开辟一个对象容量(多少对象自己定义),使用完这些对象后,自动在开辟一个对象容量。

NSMutableArray *myArray = [[NSMutableArray alloc] initWithCapacity:1];

NSMutableArray *yourArray = [NSMutableArray arrayWithCapacity:1];

NSMutableArray *bigArray = [NSMutableArray array];

2.增加数据   

 addObject: 在数组的最后面添加

[bigArray addObject:@"a"];

在指定位置插入一个元素

[bigArray insertObject:@"heihei" atIndex:1];

3.删除

删除指定元素

[bigArray removeObject:@"a"];   // 直接删除对象

[bigArray removeObjectAtIndex:0];   // 通过对象下标删除

替换

[bigArray replaceObjectAtIndex:1 withObject:@"haha"];

交换指定位置的两个元素

[bigArray exchangeObjectAtIndex:0 withObjectAtIndex:1];

删除全部

[bigArray removeAllObjects];

数组小结:数组是用来管理一组有序的元素的集合,必须保证数组中存放的都是对象,而且数组中可以存放相同元素.


7.字典

字典:用来存储具有一一对应关系的数据,本质上也是一个大容器  一个key对应一个value  key不可以重复

字典本身是无序的  不解析数据的顺序  里面的key和value是有序的

字典里的数据是成对存在的 通过key找到value

分为不可变NSDictionary  和 可变NSMutableDictionary

一.创建字典

1.初始化

NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"zhangSan", @"name", @"nan", @"sex", nil];

2.便利构造器

NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"zhangSan", @"name", @"nan", @"sex", nil];

3.字面量

NSDictionary *dic2 = @{@"name":@"zhangSan", @"sex":@"nan"};

二.字典的使用

1.求字典的元素个数

NSUInteger count = dic2.count;

2.将字典中所有的key放到一个数组中

NSArray *keys = dic2.allKeys;

3.将字典中所有的value放到一个数组中

NSArray *values = dic2.allValues;

4.字典取值

NSString *name1 = [dic2 objectForKey:@"name"];

5.判断字典是否为空 **

BOOL a = dic2.allKeys.count == 0;

三.可变字典

NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"zhangsan", @"name",@"nan", @"sex", nil];

1.字典添加一个元素

[dic setObject:@"18" forKey:@"age"];

2.修改元素

[dic setObject:@"liSi" forKey:@"name"];

setObject:forKey: 工作原理:先查找字典中有没有对应的key,如果有,则修改key对应的value,如果没有则把key-value做为元素添加到字典中.

3.移除元素

[dic removeObjectForKey:@"age"];

4.移除所有元素

[dic removeAllObjects];


8.集合

特点:无序性,互异性,本质上是一个大容器.

分为不可变NSSet 和 可变NSMutableSet

一.不可变集合

NSSet *mySet = [[NSSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"dd", @"aa", @"bb", @"bb", @"cc", nil];

1.元素的个数

NSUInteger count = mySet.count;

2.获取集合中的元素

NSString *string1 = [mySet anyObject];

3.将集合中的元素取到一个数组中

NSArray *myArray = mySet.allObjects;

二.可变集合

NSMutableSet *mySet = [[NSMutableSet alloc] initWithObjects:@"aa", @"bb", nil];

1.添加元素

[mySet addObject:@"cc"];

[mySet addObject:@"bb"];

2.移除元素

[mySet removeObject:@"aa"];

3.打印集合中的元素

for (NSString *str in mySet) {

NSLog(@"%@", str);

}


9.数组,字典,集合的区别

相同点:都是oc中的容器类,可以存储多个元素,但是元素必须都是对象,不限制对象的类型.

1.使用场景:

数组:用来管理一组有序的元素的集合.

字典:用来管理一组具有一一对应关系的数据的集合.

集合:用来管理一组无序,并且具有互异性的元素的集合.

2.特点:

数组:有序,并且元素可以重复使用.

字典:无序,key-value是字典中的一个元素,key是唯一的,一个key只能对应一个value,但是一个value可以对应多个key.

集合:无序,元素具有互异性.

3.取值方式:

数组:通过下标获取元素.

字典:通过key值获取元素.

集合:anyObject  获得一个数组  foreign遍历


10.内存管理

一.堆区内存的三种常见问题:

1.野指针问题:访问没有所有权的内存,如果想安全的访问,必须确保空间还在.

2.过度释放:对同一块空间多次释放,程序立即crash.

3.内存泄漏:空间使用完之后没有及时释放,存在安全隐患

二.内存的三种管理机制:

1.垃圾回收机制(gc):由系统来管理内存,系统识别空间何时不使用,自动回收空间,不适于iOS开发,Java采用该机制.

2.MRC:手动引用计数机制,由开发人员开辟和释放空间,并显示添加引用计数的修改代码,能够灵活的决定内存何时释放.

3.ARC:自动引用计数机制,是ios 5.0推出的,也苹果默认的内存管理机制,本质还是基于MRC,只不过对于引用计数的修改是由系统自动实现的.

alloc: +1  retain: +1  copy: +1

autorelease 如果在自动释放池内,自动释放池结束就释放了,如果在自动释放池外,会找到距离最近的自动释放池,那个自动释放池结束就回释放

三.内存管理黄金法则:

如果你对一个对象做了alloc,copy,retain操作之后,你就拥有了对象的使用权,你就有责任对它进行release,活着autorelease.

简单理解:就看自己有没有使用alloc,copy,retain这三个方法,如果使用了就必须对应上release或者autorelease, 如果没有使用,就和自己无关,不用处理.

四.内存管理问题:

1.为什么本该引用计数为0的,为什么最终还是1

引用计数只是告诉系统是否需要回收空间,当最后一次release的时候,发现引用计数为1,

就说明只有自己在使用,所以自己release之后直接回收空间即可,无需再将引用计数置0.

2.满足什么条件才会有引用计数的概念

1.必须是oc的对象

2.空间必须在堆区

(其它区的引用计数都是一个无限大的数)

五.dealloc方法        当本类的对象引用计数为0的时候会自动调用这个方法

- (void)dealloc{

[super dealloc];

}


11.协议

一.创建协议

@protocol 声明协议的关键字

方法声明在 @protocol 和  @end  中间

例如:@protocol sayHello<NSObject>    //  sayHello协议的名字

@required        // 必须实现的方法(默认的)

- (void)sayByBy;

@optional       // 不是必须实现的方法

- (void)heihei;

@end

二. 签订协议    其它类中

例如:@interface Person : NSObject<sayHello>      // 签订协议 多个协议签订< , , >

三.实现协议方法  (必须实现的一定要写)  其它类中

- (void)sayByBy{

}

四.代理

1.代理第一步:声明协议

2.代理第二部分:声明代理

3.代理人第三步:代理人执行协议方法

4.代理第四步:签订协议

5.代理第五步:成为代理人

6.代理人第六步:实现协议方法



相关文章

  • OC总结(2)

    6.数组 系统提供的数组类:类似于C语言中的数组的功能 数组是一个大容器,数组中可以储存不同类型的对象,但必须要保...

  • JSPatch下发笔记6

    OC代码: JS代码: 总结:1.不可变数组表示方法,OC:@[image],JS:[image]。2.字典取值方...

  • 深入理解Runtime

    目录 1.OC对象1.OC对象的分类2.isa指针、superClass指针总结 2.对象底层数据结构1.实例对象...

  • iOS 知识清单总结

    iOS 知识清单总结2017年7月24日 周一 一、oc基础 1、oc特点;2、分类与继承(或说扩展)的区别;3、...

  • iOS底层原理总结-- KVO/KVC的本质

    iOS底层原理总结--OC对象的本质(一) - 掘金 iOS底层原理总结--OC对象的本质(二) - 掘金 iOS...

  • Swift3.0 字符串截取问题

    小总结,希望以后能用的着 1.转换成oc再截取 2.纯swift方法

  • js iOS原生交互

    一、交互(UIWebView) 1、OC调用JS (1)OC调用代码 (2)JS代码 2、JS调用OC (1)OC...

  • for循环在OC和swift中的小区别

    OC通常用forin 如果用break代替return 结果如下 2.在swift中通常用foreach 总结 在...

  • Swift循环遍历集合方法总结

    尊重知识,转发请注明出处:Swift循环遍历集合方法总结 概要 2016年2月份我总结过OC循环遍历,文章在此:i...

  • OC引入Swift,混编

    一、OC中引入Swift 最近在研究swift时候,需要实现OC与Swift混编,因此总结了以下几个步骤实现OC中...

网友评论

      本文标题:OC总结(2)

      本文链接:https://www.haomeiwen.com/subject/bljbkttx.html