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的更多相关文章

  1. Foundation框架系列-NSArray

    NSArray常用API 数组字符串指定字符拼接 // 将数组中的元素以separator拼接返回字符串 比如@[@"a=1", @"b=2"] 以separa ...

  2. 【转】Swift 语言的设计错误

    Swift 语言的设计错误 在『编程的智慧』一文中,我分析和肯定了 Swift 语言的 optional type 设计,但这并不等于 Swift 语言的整体设计是完美没有问题的.其实 Swift 1 ...

  3. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  4. Objective - C NSArray不可变数组和NSMutableArray可变数组

    OC中存储数据最常用 的两个容器就是数组和字典,而作为最常用的,应该了解这所有的特点,及用法. OC中的数组是一个容量,有序的管理了一系列元素,并且存放在数组里的元素,必须是对象类型. 不可变数组,见 ...

  5. Objective-C( Foundation框架 一 数组(NSArray))

    OC数组 NSArray是静态的数组,就是它所指向的内容是不可改变的,它指向一段内存区域,一旦初始化,不能通过它对该内存区域的数据进行修改操作,但是它可以读数据. NSMutableArray是动态的 ...

  6. iOS开发核心语言Objective C —— 全部知识点总结

    本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基 ...

  7. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  8. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  9. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

随机推荐

  1. Laravel学习

    Laravel是个很强大的PHP框架,它剔除了开发中Web开发中比较痛苦的过程,提供了验证(authentication),路由(routing),Session和缓存(caching)等开发过程中常 ...

  2. Clipboard.js实现复制内容到剪切板

    <script type="text/javascript"> var clipboard1 = new Clipboard('.bt01'); clipboard1. ...

  3. C语言学习005:不能修改的字符串

    一段有问题的代码,你能看出来么? int main(){ char* msg="ABC"; msg[]=msg[]; puts(msg); ; } 编译这段代码并不会有什么问题,一 ...

  4. 在Winform开发中使用日程控件XtraScheduler

    在一些应用场景中,我们可能需要记录某一天,某个时段的日程安排,那么这个时候就需要引入了DevExpress的日程控件XtraScheduler了,这个控件功能非常强大,提供了很好的界面展现方式,以及很 ...

  5. 从C#到Objective-C,循序渐进学习苹果开发(5)--利用XCode来进行IOS的程序开发

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.前面几篇随笔主要介绍C#和O ...

  6. asp.net网站优化经验之谈

    最近公司一个项目上线后,经常崩溃,于是开始重视性能问题,在网上看到了许多相关文章,整理下发了上来.以备参考. 在用ASP.NET开发网站的时候,性能是永远需要考虑和关注的问题,性能不仅仅只是程序代码执 ...

  7. JQuery 快速入门一篇通

    JQuery是什么? JQuery 是一套JavaScript库, 使用它,可以很方便的进行 JavaScript的编程.比如: 获取页面元素, 修改页面元素的CSS样式等等都可以以很简单的语法完成. ...

  8. Quartz中的时间表达式介绍和常用表达式

    Quartz.NET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不 ...

  9. pymssql examples

    http://pymssql.org/en/latest/pymssql_examples.html Example scripts using pymssql module. Basic featu ...

  10. win系统盘下面安装RedHat Linux6.2ES

    安装中的流程和问题 1.安装准备 硬盘分区 下载rhel-server-6.2-i386-dvd.iso 接下来就是一些安装过程 2.安装教程有很多,可以结合参考: http://www.dedecm ...