QF——OC数组
OC中的数组:
OC中的数组和它的字符串有很多相似之处。也分为可变和不可变。
NSArray:不可变数组,一经初始化,便不能再更改;
NSMutableArray:可变数组,它其实是继承于NSArray,所以NSArray的方法它都可以用,只不过又拓展了些数组自己操作的方法。
NSArray数组的初始化:
//NSArray:不可变数组 //NSArray的实例化方法:
//对象方法:
NSArray * arr1 = [[NSArray alloc]initWithObjects:@"one",@"two",@"three", nil]; //末尾的nil表示结束符
NSArray * arr2 = [[NSArray alloc]initWithArray:arr1]; //通过已存在的数组实例化新数组 //类方法:
NSArray * arr3 = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];
NSArray * arr4 = [NSArray arrayWithArray:arr3]; //Xcode新版本的便捷方法:
NSArray * arr5 = @[@"one",@"two",@"three"]; //类似于NSString * str = @"wanger";且此时数组结尾无nil!
NSArray数组的一些常用方法:
//NSArray常用方法:
NSArray *arr = [NSArray arrayWithObjects:@"one",@"two",@"three",nil]; //求元素个数:count
NSUInteger count = [arr count];
NSLog(@"count = %lu",count); //获取某位置元素
id obj = [arr objectAtIndex:];
NSLog(@"%@",obj);
//其实这个方法很鸡肋。arr[index]效果一样
NSLog(@"%@",arr[]); //获取某元素的索引
NSInteger index = [arr indexOfObject:@"one"];
NSLog(@"index = %lu",index); //判断该数组是否包含某元素
BOOL tag = [arr containsObject:@"two"];
if(tag==YES)
{
NSLog(@"嗯,包含了。");
}else if (tag==NO)
{
NSLog(@"没包含。");
} //获取数组最后一个元素
id obj2 = [arr lastObject];
NSLog(@"lastObject为 %@",obj2); //将数组各元素连接成字符串对象
NSString *str = [arr componentsJoinedByString:@"+"];
NSLog(@"%@",str); //将字符串通过分隔符转换成数组
NSString * str1 = @"welcome to shenzhen";
NSArray *arr1 = [str1 componentsSeparatedByString:@" "];
NSLog(@"%lu",[arr1 count]); NSString *str2 = @"Hi,wang.weclome";
id seqSet = [NSCharacterSet characterSetWithCharactersInString:@",."];
NSArray *arr2 = [str2 componentsSeparatedByCharactersInSet:seqSet];
NSLog(@"%lu",[arr2 count]);
NSLog(@"%@",arr2); NSString *str3 = @"yes i am a bad body";
NSArray *arr3 = [str3 componentsSeparatedByString:@" "];
int i;
NSMutableString *mStr = [NSMutableString stringWithUTF8String:""];
for (i=(int)[arr3 count]-; i>=; i--)
{
[mStr appendString:arr3[i]];
[mStr appendString:@" "];
}
NSLog(@"%@",mStr);
OC遍历数组的3种方法:
第3种要重点掌握!
//数组遍历
NSArray *arr1 = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];
//1.最基本原始方法:for循环 //2.迭代器
NSEnumerator *erator = [arr1 objectEnumerator]; id obj;
while ((obj=[erator nextObject])!=nil)
{
NSLog(@"%@",obj);
} //3.增强型for循环
//for(对象类型 对象名 in 列表)
//优点:不需要开发者判断结束条件,自动结束
for (id obj in arr1)
{
NSLog(@"%@",obj);
}
NSMutableArray数组的常用方法:
//
// main.m
// ArrayTest
//
// Created by mac on 15-2-27.
// Copyright (c) 2015年 mac. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[])
{ @autoreleasepool {
/*
OC数组的本质是C里“指针数组”的实现。它里存储的只是对象的引用,即对象的地址。
void * arr[10]
*/ //NSMutableArray,可变数组。 //NSMutableArray继承于NSArray类,可以使用NSArray所有的方法
//因为NSMutableArray是可变数组,所以不能用 marr = @[@"one",@"two"];这样快速创建。
NSMutableArray *marr = [NSMutableArray arrayWithObjects:@"one",@"two",nil]; //常用操作方法 //增
[marr addObject:@"three"]; //从最后添加
[marr insertObject:@"zero" atIndex:]; //插入指定的位置
NSLog(@"%@",marr); //删
[marr removeLastObject]; //删除最后一位元素
[marr removeObject:]; //删除指定位置元素
[marr removeObject:@"one"]; //删除指定元素
[marr removeAllObjects]; //删除所有元素(清空数组) [marr removeObjectIdenticalTo:@"one"];
NSLog(@"%@",marr); //改
//otherArr
[marr setArray:@[@"wang1",@"wang2",@"wang3"]]; //重置数组
[marr replaceObjectAtIndex: withObject:@"1wang"]; //替换某位的对象
NSLog(@"%@",marr); }
return ;
}
如何在OC数组中存储基本类型数据?
C中数组存储的是同类型的基本类型数据;
OC中数组存储的是对象,它的所有元素都是对象。
那我们怎么在OC数组中存储基本类型数据呢?
OC提供了NSNumber类,它通过numberWithInt:(int)num 等方法把int型的基本类型数据转换为NSNumber型对象,这个过程称为装箱。这样就可以存储在OC对象中了!
NSArray *arr1 = @[@"one",@"two",@"three"];
NSArray *arr2 = @[@"four",@"five",@"six"];
NSArray *arr3 = @[@"seven",@"eight",@"nine"]; NSArray *arr = @[arr1,arr2,arr3]; //怎么在OC数组中存储基本类型数据,比如数字?
//数字类NSNumber
NSNumber * num1 = [NSNumber numberWithInt:]; //把int型数字1转换为NSNumber对象
NSNumber * num2 = [NSNumber numberWithInt:];
NSNumber * num3 = [NSNumber numberWithInt:]; NSArray *numArr = @[num1,num2,num3]; //把数字对象存进OC数字里
for(id obj in numArr) //遍历arr数组
{
NSLog(@"%i",[obj intValue]); //obj分别为arr[0],arr[1],arr[2];即num1,num2,num3对象,调用它们的intValue方法,把对象转换为int型数据
}
装箱和拆箱:
把基本类型数据转换成对象类型的数据,这个过程称为装箱;相反的,把对象转换为基本类型数据的过程称为拆箱。
在Java中,把基本类型数据,比如int型数字的装箱操作就是把它转换为包装类Integer。而且Java中的装箱和拆箱都是全自动的,不同程序员动手,它自己会完成。也就是说,若要往容器中放入数字等,程序员只要直接放就行了,编译器会自动把它们转换为包装类型的对象。
但是在OC中,装箱是通过 NSNumber num1 = [numberWithInt : 3] ;——>把数字3转换为NSNumebr类型的对象num1;
拆箱是通过 [num1 intValue] ;——>把NSNumber类型的对象转换为int型数字。
不过,在新版本的OC中,装箱动作有了便捷方式:在基本类型数据前加上 @ ,就完成装箱了。
NSArray * arr = @[@,@,@]; //便捷装箱方式:把数字3,4,5分别装入数组arr中。
NSLog(@"%@",arr);
QF——OC数组的更多相关文章
- 15.Object-C--浅谈Foundation框架OC数组NSArray与NSMutableArray
昨天总结了一下NSString与NSMutableString,今天我在这里总结一下NSArray与NSMutableArray. NSArray数组是:不可变数组. nil 是数组元素结束的标记.O ...
- OC数组的简单使用、NSArray
和上一篇文章一样,数组的重要性不言而喻,在OC编程的过程中我们会不断的使用到NSArray,和C语言不同的是,我们这里的数组只能存OC对象类型,不能存C语言基本数据类型,也不能存NSNull类型,但是 ...
- QF——OC字符串
OC中的字符串: C中没有字符串类型,用字符数组和指针代替. OC中引入了字符串类型,它包括NSString 和 NSMutableString两种 NSString是不可变的,已经初始化便不能更改: ...
- iOS开发基础:OC数组对象NSArray的常用方法
本文介绍了OC的数组对象的基本方法的使用: 因为OC的数组中存储的为对象类型,所以我们可以新建一个Person类,通过Person生成对象进行操作. 其中Person.h中的代码为: [objc] v ...
- OC数组常见操作
// 数组存放的内容必须是NSObject对象,数组中存放的内容是有序的 // 数组打印输出在输出台是用()包括起来的 // NSArray 不可变数组 // 1.创建对象 // 初始化方法 NSAr ...
- OC 数组
/*---------------------------创建数组------------------------------*/ //NSArray *array = [[NSArray alloc ...
- QF——OC中的SEL类型和Block
@selector(): 可以理解@selector()就是取类方法的编号,他的基本行为类似于C语言中的函数指针(指向函数的指针).它们通过传递方法的地址(或编号)来实现把方法当做参数的效果. 不过在 ...
- QF——OC内存管理详解
堆的内存管理: 我们所说的内存管理,其实就是堆的内存管理.因为栈的内存会自动回收,堆的内存需要我们手动回收. 栈中一般存储的是基本数据类型变量和指向对象的指针(对象的引用),而真实的对象存储在堆中.因 ...
- QF——OC的多态,动态绑定及实现原理
多态: 封装,继承,多态是面向对象的三大特征. 那多态到底是什么呢? 多态:允许不同的类定义相同的方法,OC能自己判断当前类所对应的方法,不会混乱. 动态类型:程序直到运行时才确定对象的类型. 动态绑 ...
随机推荐
- 具体总结 Hive VS 传统关系型数据库
本文思路,看图说话,一张图,清晰总结二者差别 以下对图中的各条做具体总结 1.查询语言 不做赘述 2.数据存储位置 不做赘述 3.数据格式 Hive:Hive 中未定义专门的数据格式,数据格式能够由用 ...
- uva 748 Exponentiation 浮点数乘方运算 高精度水题
输入的前六位数表示一个小数,然后输入一个数表示几次方.要求用高精度算出结果. 高精度水题,主要注意处理小数点,先在输入时把小数点提取出来并记录位置,用普通乘法计算出结果后由后向前计算位置添加小数点. ...
- Centos升级gcc4.4.7升级gcc4.8手记
本博客来自:http://www.mudbest.com/centos%E5%8D%87%E7%BA%A7gcc4-4-7%E5%8D%87%E7%BA%A7gcc4-8%E6%89%8B%E8%AE ...
- 初识动画animation
工作半年了,基本没怎么用到动画,现在对已学到的动画做一个总结(真的非常非常基础啊啊啊),准备之后再慢慢研究一下动画(有好的教程可以推荐给我咩~~). animation animation:mymov ...
- struts2 s:if 的字符串比较问题
如果数据库字段的数据类型为string or char 类型,此时在页面 <s:if test=""></s:if> 中test <s:iterat ...
- 用JS做图片轮播
脚本之家 首页应用手游攻略教程 ﹤首页 >> 网络编程 >> JavaScript >> 网页特效 >> 图象特效 js 图片轮播(5张图片) 作者:m ...
- adb server didn t ack failed to start daemon
关掉Ecilpse,打开cmd命令行 1)cd到sdk的platform-tools目录下, 2)执行 adb kill-server ,出现 server not runing 提示 3)执行 ...
- 【C#】开发可以可视化操作的windows服务
使用C#开发自定义windows服务是一件十分简单的事.那么什么时候,我们需要自己开发windows服务呢,就是当我们需要计算机定期或者一直执行我们开发的某些程序的时候.这里我以一个WCF的监听服务为 ...
- Docker终极指南:为什么Docker能做这么多事
Docker终极指南:为什么Docker能做这么多事 http://www.aboutyun.com/thread-11499-1-1.html
- BF算法(朴素的模式匹配算法)
#include <stdio.h> #include <stdlib.h> int Index_BF(char S[],char T[])//s为目标串(长串),t为模式串( ...