objective-c系列-NSArray
OC数组NSArray
对比 c数组 和 oc数组对象(指针)
定义 int array[10]; NSArray *array;
特点: 元素类型必须相同, 元素可以是任意对象
而且只能c的数据类型 但是不能是c的数据类型
字面常量: (数组类型){1,2,3}能 @[@"one",@"two"]
表达一个数组常量
访问元素: array[i] ?
**********************************************
//oc数组对象的构造方法
// NSArray * arr1 = [[ NSArray alloc]init]; //这种构造无意义
NSArray * arr1 = [[ NSArray alloc]initWithObjects:@"one",@"two",@"three", nil];
NSLog(@"arr1: %@ 地址:%p",arr1,arr1);
NSArray * arr2 = [[ NSArray alloc]initWithArray:arr1];
NSLog(@"arr2: %@ 地址:%p",arr2,arr2);
#define ARRAY1 @[@"one",@"two",@"three"]
// NSArray * arr3 = @[@"one",@"two",@"four"];
NSArray * arr3 = ARRAY1; //ARRAY1放在某一个常量区地址
NSLog(@"arr3: %@",arr3);
NSArray * arr4 = ARRAY1; //ARRAY1放在了另一个常量区的地址
NSLog(@"arr3:%p, arr4:%p",arr3,arr4);
// 地址不同!!
**********************************************
// 类方法
NSArray * arr1= [NSArray arrayWithObjects:@"one",@"two", nil];
NSArray * arr2 =[NSArray arrayWithArray:arr1];
NSArray *array = @[@"123",@"456",@"789",@"abc",@"def"];
**********************************************
//将数组里的所有字符串对象拼接成一个字符串对象并返回
NSArray * array = @[@"there",@"is",@"a",@"girl" ];
NSString * result = [array componentsJoinedByString:nil];
NSLog(@"result: %@ 长度为:%lu", result, [result length]);
**********************************************
//分割字符串,需要用到一个分割符字符串, 分割后的结果放在数组里
NSString * str = @"there is a beautiful girl in my heart,but she is not my wife";
NSArray * array = [str componentsSeparatedByString:@" "];
NSLog(@"array: %@", array);
// 这样的话,heart,but就变成一个单词了,与我们的意图相悖
所以:
NSCharacterSet *setSeparate = [NSCharacterSet characterSetWithCharactersInString:@", "];// 注意:@", "字符串包括一个@","和一个@" "!这和c中的拆分字符串方法很类似,可以添加多个拆分字符
NSArray * aha = [str componentsSeparatedByCharactersInSet:setSeparate];
注意:当拆分字符或字符串在被拆分字符串中联系出现时,拆分后放到数组里的对象就会 有一个@"",空对象!
打印或者计数方法都会受影响,解决办法: [aha removeObject:@""];// 移除所有在数组中的@""对象
**********************************************
//在一个数组中查询某一个对象是否存在
NSArray * array = @[@"one",@"two",@"three",@"four",@"two"];
if ([array containsObject:@"one"]==YES)
{
NSLog(@"one在数组中存在");
// 如果one在数组中存在,那么它肯定有一个下标,
NSUInteger index = [array indexOfObject:@"one"];
NSLog(@"one的下标为: %lu", index);
}
else
{
NSLog(@"one在数组中不存在");
}
//获取一个对象在数组中的下标,如果对象在数组中不存在,则返回NSNotFound
if( [array indexOfObject:@"jobs"] == NSNotFound )
NSLog(@"jobs 在数组中不存在");
**********************************************
// 访问元素
NSArray * arr1 = @[@"one",@"two",@"three"];
//用下标运算符访问某个元素
NSLog(@"arr[1] is %@", arr1[1]);
//调方法访问某个元素
NSLog(@"objectAtIndex:1 == %@", [arr1 objectAtIndex:1]);
//获取元素数量
NSLog(@"arr1的元素个数为: %lu", [arr1 count]);
//遍历数组对象
//1, 用循环和下标运算符遍历
NSUInteger i;
for (i=0; i<[arr1 count]; i++) {
NSLog(@"arr[%lu]=%@", i,arr1[i]);
}
//2, 用循环和方法objectAtIndex: 完成遍历
for (i=0; i<[arr1 count]; i++) {
NSLog(@"[arr1 objectAtIndex:%lu] == %@", (unsigned long)i, [arr1 objectAtIndex:i]);
}
//3, 快速枚举法
for( id obj in arr1) // for(int i=0;i<10;i++)
{
NSLog(@"快速枚举法:obj=[%@]",obj);
}
//4,枚举器法, 首先认识一种枚举器对象
// 枚举器对象 这个方法是获取一个数组的枚举器
// 正序枚举器
NSEnumerator * enumerator =[arr1 objectEnumerator];
id obj;
while (obj = [enumerator nextObject]) {
NSLog(@"正序枚举器法遍历: obj == %@", obj);
}
// 逆序枚举器
NSEnumerator *enumerator2 = [arr1 reverseObjectEnumerator];
while (obj = [enumerator2 nextObject]) {
NSLog(@"逆序枚举器法遍历: obj == %@", obj);
}
**********************************************
//数组排序
// 要回调的函数
NSInteger compareTwoObjects(id obj1, id obj2, void * args)
{
// struct student * stu = args;
// printf("args:%s\n",args);
//1,比较字符串大小
// return [obj1 compare:obj2];
//2, 比较字符串的长度
return [obj1 length]-[obj2 length];
//3, 将字符串转成整型,再比较整型的大小
// return [obj1 integerValue]-[obj2 integerValue];
}
NSArray *array = [[ NSArray alloc]initWithObjects:@"123",@"4567",@"34",@"111", @"x",nil];
// 对数组的元素进行排序: 传进来的是一个回调函数,用于处理比较细节
NSArray * newArray = [array sortedArrayUsingFunction: compareTwoObjects context:"testString"];
**********************************************
数组排序方法sortedArrayUsingFunction:context:在官方文档里有很详细的介绍,并且有相关例子可供参考
**********************************************
objective-c系列-NSArray的更多相关文章
- Foundation框架系列-NSArray
NSArray常用API 数组字符串指定字符拼接 // 将数组中的元素以separator拼接返回字符串 比如@[@"a=1", @"b=2"] 以separa ...
- 【转】Swift 语言的设计错误
Swift 语言的设计错误 在『编程的智慧』一文中,我分析和肯定了 Swift 语言的 optional type 设计,但这并不等于 Swift 语言的整体设计是完美没有问题的.其实 Swift 1 ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective - C NSArray不可变数组和NSMutableArray可变数组
OC中存储数据最常用 的两个容器就是数组和字典,而作为最常用的,应该了解这所有的特点,及用法. OC中的数组是一个容量,有序的管理了一系列元素,并且存放在数组里的元素,必须是对象类型. 不可变数组,见 ...
- Objective-C( Foundation框架 一 数组(NSArray))
OC数组 NSArray是静态的数组,就是它所指向的内容是不可改变的,它指向一段内存区域,一旦初始化,不能通过它对该内存区域的数据进行修改操作,但是它可以读数据. NSMutableArray是动态的 ...
- iOS开发核心语言Objective C —— 全部知识点总结
本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
随机推荐
- WebGL实现HTML5的3D贪吃蛇游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
- 【转载】[jquery.validate]自定义方法实现"手机号码或者固定电话"的逻辑验证
最近项目开发中遇到这样的需求“手机号码或者固话至少填写一个”,如下图所示: 项目采用的jquery.validate.js验证组件,目前组件不支持这种“或”逻辑的验证,于是就自己定义一个 jQuery ...
- C#协变和逆变
我们知道在C#中,是可以将派生类的实例赋值给基类对象的.
- No assembly found containing an OwinStartupAttribute
自从在ASP.NET MVC中使用NuGet添加SignalR类库之后,再次运行程序时,它出现了一个异常: Server Error in '/' Application. The following ...
- 只用CSS实现容器内图片上下左右居中
一直以来,大家都知道,DIV容器内设置 text-align:center 即可让图片居中,但是DIV内默认的图片是上对齐,不会上下居中,如果想要实现这样的效果,JS判断是比较麻烦的,因为DIV容器内 ...
- .NET中类(class)与结构(struct)
结构是值类型:值类型在栈上分配空间: 类是引用类型:引用类型在堆栈上分配空间: 虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object: 虽然 ...
- 炉石传说 C# 开发笔记(6月底小结)
炉石传说的开发,已经有30个工作日了. 关于法术的定义方法,有过一次重大的变更:法术效果是整个炉石的核心,正是因为丰富的法术效果,才造就了炉石的可玩性. 原来构思的时候,对于法术效果没有充分的理解,所 ...
- 孙鑫MFC学习笔记8:对话框编程(下)
1.在按钮上没有字体设置,但是在对话框上有字体设置 2.让按钮进行消息响应 *1.创建按钮 *2.创建从按钮继承的类 *3.关联对象 3.属性页编程 *1.在对话框资源中新建属性页 *2.为属性页创建 ...
- 关于Bugzilla WebService接口
参考:http://www.bugzilla.org/docs/3.2/en/html/api/Bugzilla/WebService.html http://www.bugzilla.org/doc ...
- 第 17 章 CSS 边框与背景[下]
学习要点: 1.设置背景 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS 边框和背景,通过边框和背景的样式设置,给元素增加更丰富的外观. 一.设置背景 盒模型的尺寸可以通过两种方式实现可见性, ...