ios学习第三天杂记--Objective-c中的集合类

  Objective-C中的集合类:

  1. 数组 NSArray

  在Objective-C中的集合类中主要包括不可变的数组--NSArray, 可变的数组--NSMutableArray,

                   不可变的字典--NSDictionary, 可变的字典--NSMutableArray,

                   不可变的集合--NSSet , 可变的集合--NSMutableSet

  1>. 不可变的数组 NSArray

   数组是有序对象的集合,用来存储对象的有序列表,在OC中数组中必须存的是对象,不能是基本数据类型,若想存入基本数据类型,必须先把数据类型转换成对象,然后再存入集合类中。 NSArray也是OC中的一个对象,使用NSArray也需要进行实例化,

    (1). NSArray的初始化:

  •     NSArray的便利初始化函数: -(id) initWithObjects : (id) firstObject, ....;
  •     NSArray的便利构造器: +(id) arrayWithObjects: (id) firstObject, ...;
  •         //NSArray的便利初始化
            NSArray *array1 = [[NSArray alloc] initWithObjects:@"aaa", @"bbb", @"ccc", nil];
            //NSArray的便利构造器
            NSArray *array2 = [NSArray arrayWithObjects:@"111", @"222", @"333", nil];

     (2). 获取数组元素的个数和数组的元素

    -(NSUInteger) count; 获取数组元素的个数

    -(id) objectAtIndex : (NSUInteger) index;

       int count = (int)[array1 count];
        id element = [array1 objectAtIndex:0];
        NSLog(@"array1_count = %d, array[0] = %@",count, element);       //对Array1的元素进行遍历
        for(int i = 0; i < [array1 count]; i++){
            id temp = [array1 objectAtIndex: i];
            NSLog(@"%@",temp);
        }

    2>. 可变的数组NSMutableArray

      NSArray的容量是固定的,而NSMutableArray的容量是可变的,我们可以在NSMutableArray实例化的时候先初始化一个容量,不过这个容量不是固定的,不够的时候会自动增加。NSMutableArray是NSArray的子类,是对NSArray的一个扩充。

      (1) NSMutableArray的初始化

NSMutableArray的便利初始化函数:-(id) initWithCapacity : (NSUInteger) numItems;

NSMutableArray的便利构造器:+(id) arrayWithCapacity: (NSUInteger) numItems;

       (2) 元素的添加和删除 

      增加元素: -(void) addObject: (id) anObject; --往数组的尾部添加元素

删除全部内容: -(void) removeAllObjects;

删除最后一个元素: -(void) removeLastObject;

通过索引删除元素: -(void) removeObjectAtIndex: (NSUInteger) index;

删除任意一个元素: -(void) removeObject : (id)object;

      (3) 元素的插入和替换   

      通过数组的索引来进行元素的替换:-(void) replaceObjectAtIndex :(NSUInteger) index withObject: (id) anObject;

   在指定索引处插入对象:-(void) insertObject : (id) anObject atIndex : (NSUInteger) index;

        array1 = [NSMutableArray arrayWithObjects:@"111", @"222", @"333", nil];
        [array1 replaceObjectAtIndex: 0 withObject:@"aaa"];
        NSLog(@"%@", array1);        [array1 insertObject:@"RanJin" atIndex: 1];

      (4) 数组的遍历

      (此处使用枚举器和快速枚举)

      1>. 枚举器(迭代器):要通过NSEnumerator来遍历数组首先得通过-(NSEnumerator *) objectEnumerator来得到枚举器;通过枚举其中的nextObject来获取对象.     

     //获取枚举器
        NSEnumerator *enumerator = [array1 objectEnumerator];
        //临时变量
        id obj;
        while (obj = [enumerator nextObject]) {
            NSLog(@"%@", obj);
        }

      2>.  快速遍历法,相当于PHP中的foreach的用法     

        for(id obj in array1){

            NSLog(@"%@", obj);
        }

    2. 字典(Dictionary)

     字典就像java中的Map, 里面存的是键值对,key的值是不可以重复的。字典有可改变的和不和不可改变之分。

     1.不可变字典NSDictionary

      (1) 字典的创建和获取字典的值

     NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];//不可变字典的初始化(注意顺序)
        id value = [dictionary objectForKey: @"key1"];//获取字典的值
        NSLog(@"The value of the key1 is %@", value);

      (2) 字典的遍历

      字典的遍历方法是通过字典里的-(NSArray *)allKeys获取所有的key存入数组中然后通过遍历数组获取key对应的value,封装成函数如下:

        NSArray *keys = [dictionary allKeys];
        for(id obj in keys){

            NSLog(@"%@==>%@", obj, [dictionary objectForKey: obj]);
        }

     2. 可变字典NSMutableDictionary

      在使用可变字典NSMutableDictionary时可以先给可变字典初始化一个空间,如果不够的话会自动增加

      给可变字典分配初始化空间: +(id) dictionaryWithCapacity : (NSUInteger) num;

  给可变字典添加对象:-(void) setObject(id) obj  forKey(id) aKey;

  根据关键字删除对象:-(void) removeObjectForKey : (id) aKey;

  删除字典中的所有数据: -(void) removeAllObjects;

        NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity: 3];
        //添加元素
        [dictionary setObject:@"CEO" forKey:@"Nick"];
        [dictionary setObject:@"Manager" forKey:@"Isabel"];
        [dictionary setObject:@"CTO" forKey:@"Nicole"];
        NSLog(@"%@", dictionary);
        //移除元素
        [dictionary removeObjectForKey: @"Nick"];
        NSLog(@"%@", dictionary);

    3. set集合

?      Set集合类就像我们数学中的集合一样是无序和不重复的,Set中也只能存放对象,也分为可变集合NSMutableSet和不可变集合NSSet。

      出现了一个问题,记录下,我在接口文件中声明了array_display()方法,在实现文件中实现了这一方法,可是在main.m文件中,在new了一个array数组对象之后,为什么这个对象不能调用那个方法??而只能在main方法里去实现。

//      array_display(setToArray);//为什么不起作用
        NSEnumerator *enumerator = [setToArray objectEnumerator];
        id obj;
        while (obj = [enumerator nextObject]) {
            NSLog(@"%@", obj);
        }

?     1.不可变集合NSSet

?    ?    ?    ?(1)NSSet的初始化和其他集合类一样也有其对应的便利初始化方法和便利构造器,

?    ?    ?    ?    ?    ?便利初始化方法:-(id) initWithObjects: (id) firstObject, ...;

?    ?    ?    ?    ?    ?便利构造器:+(id) setWithObjects: (id) firstObject, ...;

?    ?    ?    ?(2)NSSet中也有-(NSUInteger) count 来获取元素的对象

?    ?    ?    ?(3) 获取集合中的元素

?    ?    ?    ?    ?    获取全部的集合元素,以数组的形式返回:-(NSArray *) allObjects;

?    ?    ?    ?    ?    ?随进获取集合中的元素:-(id) anyObject;

?    ?    ?    ?(4)判断两个Set是否相同 : - (BOOL) isEqualToSet: (NSSet *) otherSet;

?    ?    ?    ?(5)判断一个元素是否在本集合中 -(BOOL) member: (id) obj;

     

?      2、可变Set: NSMutableSet

?    ?      ?1.可变集合的实例化和初始化

?    ?    ?      ?便利初始化函数: -(id) initWithCapacity :(NSUInteger) numItems;

?    ?    ?      ?便利构造器:+(id) setWithCapacity: (NSUInteger) numItems;

?    ?    ?  2.往可变集合中添加元素

?    ?    ?      ?-(void) addObject : (id) object;

?    ?      ?3.删除集合中的对象

?    ?    ?      ?-(void) removeAllObjects; 删除所有的对象;

?    ?    ?      ?-(void) removeObjects: (id) object 删除其中某一个对象;

        //便利初始化函数分配大小
        NSMutableSet *set01 = [[NSMutableSet alloc]initWithCapacity: 3];
        NSMutableSet *set02 = [NSMutableSet setWithCapacity:3];
        //添加元素
        [set01 addObject:@"aa"];
        [set01 addObject:@"bb"];
        [set01 addObject:@"cc"];

        NSArray *array = [set01 allObjects];
        NSEnumerator *enumerator = [array objectEnumerator];
        id obj;
        while (obj = [enumerator nextObject]) {
            NSLog(@"%@", obj);
        }

    Finally:把基本数据类型包装成对象

    ?前面不止一次的提到在OC中的集合类中是不能放基本数据类型的,那么我们如何把基本数据类型封装成对象呢? 在OC中给我们提供啦一个类专门来把基本数据类型封装成对象,这个类就是NSNumber.

?1. NSNumber的用法如下(还没在代码中测过。只是把别个写的copy过来了,供自己以后学习。)

?    ?    ?    ?把基本类型包装成对象的便利构造函数

?    ?    ?    ?    ?-(id) initWithChar : (char) value;

?    ?    ?    ?    ?-(id) initWithInt : (int) value;

?    ?    ?    ?    ?-(id) initWithFloat : (float) value;

?    ?    ?    ?    ?-(id) initWithBool: (BOOL) value;

?      把基本数据类型包装成对象的便利构造器

?    ?    ?    ?    ?+(id) numberWithChar : (char) value;

?    ?    ?    ?    ?+(id) numberWithInt : (int) value;

?    ?    ?    ?    ?+(id) numberWithFloat : (float) value;

?    ?    ?    ?    ?+(id) numberWithBool : (BOOL) value;

?      从NSNumber中获取值

?    ?    ?    ?    ?-(char) charValue;    ?    ?-(int) intValue;      ?-(float) floatValue;    ? (BOOL) boolValue;    ?(NSString *) stringValue;

      2、在集合类中是不可以存储nil(空的),因为nil作为nil的结束符,那么我们如何来存储空对象呢?该NSNull出场啦,其功能是把null包装成对象,

?    ?    ?    ?    ?+(NSNull *) null;

时间: 2024-08-05 15:13:32

ios学习第三天杂记--Objective-c中的集合类的相关文章

ios学习第三天杂记

ios学习第三天杂谈,从一个接口文件和实现文件(student.h与student.m)中学习到的.相关文章请参考: OC精选字符串处理方法. 1. 代码规范: 1.1: 类名的首字母要大写 1.2: 方法的命名用驼峰命名法 2. 干货 2.1: 要在一个类中实例化类,需要先引入类的接口文件如***.h. 2.2: OC中类的实例化方式是 Student  *student =  [[Student alloc] init], 可以理解为Student类在NSObject类中继承了alloc方法

IOS学习随笔三

IOS storyboard做界面跳转设计页面: self.dismissViewControllerAnimated(true, completion: nil ) ios8已经替换掉了老得方法定义  使用两个参数的dismissViewControllerAnimated NIB做界面设计: self.presentViewController(MyViewController(nibName: "MyViewController", bundle: nil), animated:

iOS学习第四天杂记--Objective-C中的内存管理

先说明下,原文为青玉伏案写的.我这只是学习而已. OC中的内存管理. OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象时,会将该对象的引用计数器加1(通过retain来实现):当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现):当计数器为0时,该对象占用的内存空间会被收回.在NSObject类有一个retainCount方法,调用该方法可获取当前对象的引用计数值. Tips:测试时

iOS 学习笔记 三 (2015.03.05)

// 当发现了我们所需要的characteristic,我们最想做的就是查看下这个characteristic的value是多少.也就是说,我们需要一个接收数据的操作. - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error 在CoreBluetooth中,提供了两种方法:1. [peripheral

MyBatis的学习总结三:优化MyBatis配置文件中的配置

一.优化Mybatis配置文件conf.xml中数据库的信息 1.添加properties的配置文件,存放数据库的信息:mysql.properties具体代码: driver=com.mysql.jdbc.Driver url=jdbc:mysql://172.32.231.206:3306/edihelper username=root password=joyplus_edi 2.在conf.xml中引入配置文件,进行修改 <?xml version="1.0" encod

mybatis学习(三)----优化Mybatis配置文件中的配置

一.把连接数据库的配置单独放在一个properties文件中 前面我们是把数据库的连接信息放在了mybatis-config.xml中,如下: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/myb

iOS学习篇之一个XIB在Storyboard中多处使用

在微博中看到一位博主分享了这篇文章,是在StackOverFlow中有一位提问者提出的问题,下面的人给予了解答,解决方案还是很有意思的,这里分享一下. 链接在这里. 我在试验的过程中出现了很多问题,有些地方设置不对总是报错,不过最后终于被我解决了. 大家先看原文吧,试一试,我稍后补上演示我试出来的步骤.^_^

【IOS学习基础】NSObject.h学习

一.<NSObject>协议和代理模式 1.在NSObject.h头文件中,我们可以看到 // NSObject类是默认遵守<NSObject>协议的 @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } // 往上翻看到NSObject协议的声明@protocol NSObject/* 中间一大堆方法的声明*/@end 然后我就产生疑问了,为什么我们自己定义的协议是这样,后面加上了<

iOS学习笔记---oc语言第三天

继承.初始化方法 一.继承 继承的上层:父类  继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量也继承过来了,只是不能访问) 面向对象提供了继承语法.能大大简化代码,把公共的方法和实例对象写在父类里.子类只需要写自己独有的实例变量和方法即可 继承既能保证类的完整,又能简化代码 继承特点 oc中只允许单继承 没有父类的类称为根类,oc中得根类是NSObject(祖宗) 继承的内容:所有的实例变量