IOS知识点总结 一 (NSArray)

一:概述

  NSArray是不可变数组,一旦数组建立后,数组元素不能增加或删除,也就是不能改变数组的长度,而数组中的元素的值也不能修改,只能是最初创建的值。

  NSMutableArray是可变数组,它是NSArray的子类,它可以对数组元素进行增,删,改。

二:创建数组的几个方法

//c语言数组
NSString *num[3]={@"first",@"second",@"third"};

//创建数组 最后一个元素必须是nil
NSArray *student = [NSArray arrayWithObjects:@"aaa",@"bbb",@"ccc",@"ddd",nil];

//利用已创建的数组初始化
NSArray *stuCopy=[NSArray arrayWithArray:student];

//利用c数组初始化
NSArray *numCopy=[NSArray arrayWithObjects:num count:3];

  这几个方法创建的数组都是利用源数组初始化新的数组,新数组在内存中与源数组不在同一块区域。

三:数组常用的方法

  1.数组排序 (对数组执行排序操作,返回的是一个新的数组,对源数组中元素的排序没有影响)

 1 //创建元素字符串
 2 NSString *data=@"15,13,18,9,23";
 3
 4 //字符串转数组
 5 NSArray *temp=[data componentsSeparatedByString:@","];
 6
 7 //排序数组
 8 NSArray *array=[temp sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
 9
10             //将元素封装为可以按数字大小比较的NSNumber对象
11             NSNumber *number1=[NSNumber numberWithInt:[obj1 intValue]];
12             NSNumber *number2=[NSNumber numberWithInt:[obj2 intValue]];
13
14             //进行比较
15             NSComparisonResult result=[number1 compare:number2];
16
17             //若obj1和obj2是降序排列,则返回结果为1,即源数组将按升序排列。
18        return result == NSOrderedDescending;  //按升序排列
19       // return result == NSOrderedAscending;   //按降序排列
20         }]; 

  2.判断数组是否包含给定元素 。

    实现原理:利用-containsObject:(id)object这个方法,在方法中遍历整个数组,向每一个数组元素发送-isEqual:(id)object这个方法,若有某个元素的结果为TRUE,则返回YES,否则返回NO。

    -isEqual方法在判断NSString和NSNumber详解:

    -isEqual的方法在两个判断的对象指针相等的情况下则肯定是返回TRUE的,那么在指针不等而值相等的情况下有以下几种情况。

    (1)判断NSString的情况

      判断字符串是否相等的唯一条件就是字符串的hash值。所以只要字符串的值相等,不管指向它的指针是否相等,则判断结果就是TRUE。

      ps:NSString *[email protected]"abc";

        NSString *str2=[NSString stringWithFormate:@"abc"];  

       str1在 常量区,而str2在堆区,两个字符串的指针不一样,但是字符串的值都是@"abc".那么 [str1 hash] == [str2 hash] .同样 [str1 isEqual:str2]的结果为TRUE。

    (2)判断NSNumber的情况

      首先是NSNumber在创建时的指针分配,NSnumber在创建时,如果用相同的方法创建,只要值相等,则返回内存中相同的指针。

      ps:NSNumber *number1=[NSNumber numberWithIntValue:1];

       NSNumber *number2=[NSNumber numberWithIntValue:1];

       则number1和number2指向的是内存中的相同区域,也就是number1 == number2.

      ps:NSNumber *number1=[NSNumber numberWithIntValue:1];

         NSNumber *number2=[NSNumber numberWithDouble:1.0];

         此时number1和number2的值不相等,number1 != number2。但是 [number1 hash] == [number2 hash]。同样[number1 isEqual:number2]结果为TRUE。

    所以-isEqual在判断NSString和NSnumber时,就直接考虑它的值是否相等,而不管这两个在内存中是否指向同一个对象。

    (3)判断NSIndexPath的情况和上两种情况一样,只要两个对象的值相等,不管在内存中是否为同一个对象,用isEqual判等的结果为TRUE

    (4)在判断一般自定义类的情况,如果没有重写isEqual方法,则系统只简单的判断是否指针相等,即是否为内存中的同一个对象。若重写isEqual方法,则有一定的规定格式和要求。

    系统默认的判等:

  - (BOOL)isEqual: (id)other
   {
       return self == other;
   }  

  - (NSUInteger)hash
  {
      return (NSUInteger)self;
  }    

  3.枚举遍历数组

   -objectsEnumerator; //得到枚举对象

     -reverseObjectEnumerator; //得到反向枚举对象

// NSEnumerator示例
NSArray *array = [NSArray arrayWithObjects:@"One",
@"Two", @"Three", @"Four", nil];

//生成枚举
NSEnumerator *enumerator = [array objectEnumerator];

//获取枚举对象
 id thing;
while (thing = [enumerator nextObject])
{
    NSLog(@"I found %@",thing);
 }

  快速枚举 for (type newVariable in expression){ //todo } , 快速枚举用到了修改监视器,

如果在枚举的过程中企图修改集合, 则会产生异常。

  4.数组元素组合成字符串

  -(NSString *)componentsJoinedByString:(NSString *)separator ;

      

时间: 2024-10-13 15:49:32

IOS知识点总结 一 (NSArray)的相关文章

oc/object-c/ios哪种遍历NSArray/NSDictionary方式快?测试报告

做app的时候,总免不了要多次遍历数组或者字典.究竟哪种遍历方式比较快呢?我做了如下测试:首先定义测试用宏: ? 1 2 3 4 5 6 7 8 9 #define MULogTimeintervalBegin(INFO) NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];\ NSTimeInterval duration = 0;\ NSLog(@"MULogTimeintervalBegin:%@", IN

iOS知识点大纲

Xcode使用 1. 创建UI工程 基本控件 2. UILabel标签 3. UIButton按钮 项目: 计算器项目 4. UIImageView(UIImage)   项目: 人人界面 5. UIView 视图+触摸   项目: 人人界面 6. UITextField输入框/电子词典 7. iOS常用控件 8. 手势操作 视图控制器和多视图程序 9. UIViewController 10.UINavigationController 项目: 人人界面模拟 11. UITabBarContr

iOS 知识点梳理

OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错的编程语言, Objective-C具有相当多的动态特性,表现为三方面:动态类型(Dynamic typing).动态绑定(Dynamic binding)和动态加载(Dynamic loading).动态——必须到运行时(run time)才会做的一些事情. 动态类型:即运行时再决定对象的类型,这

iOS知识点-总结

1.#import和#include的区别 @class? @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文 件中还是需要使用#import 而#import比起#include的好处就是不会引起交叉编译 2. readwrite,readonly,assign,retain,copy,nonatomic 属性的作用 @property是 一个属性访问声明,扩号内支持以下几个属性: 1,getter=getName,setter=setName,设置setter与 get

iOS知识点集合

一.前言部分 文中的问题多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.怎样防止指针的越界使用问题? 答案: 1 .防止数组越界,必须让指针指向一个有效的内存地址, 2. 防止向一块内存中拷贝过多的内容 3. 防止使用空指针 4 .防止改变const修改的指针 5. 防止改变指向静态存储区的内容 6. 防止两次释放一个指针 7. 防止使用野指针. 2.http请求方式有哪些? 答案: 1)GET 2)HEAD 3)PUT 4)DELETE 5)POST 6)OPTIONS 3.uivi

iOS知识点全梳理-备用

感谢大神分享 文/Jack_lin(简书作者)原文链接:http://www.jianshu.com/p/5d2163640e26著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡.矫情一下,言归正传,我奉献一下,为iOS应聘者梳理一下面试题,希望能助一臂之力! OC的理解与特性

ios知识点

  1.搞清楚touch事件的传递(事件的响应链) 事件的响应(responder chain) 只有继承了UIResponder的类才能响应touch事件,从上图的响应者链可以看出,优先是最上层的view响应事件,如果该view有视图控制器的话会是下一个响应者,否者就是该view的父视图,这样至上而下传递事件.直到单例UIWindow对象,最后是单例UIApplication对象以终止,UIApplication的下一个响应者是nil,已结束整个响应循环.事件在传递过程中视图可以决定是否需要对

iOS知识点、面试题 之三

最近面试,发现这些题个人约到的几率打一些,与大家分享一下,分三文给大家: 当然Xcode新版本区别,以及iOS新特性 Xcode8 和iOS 10 在之前文章有发过,感兴趣的可以查阅: http://www.cnblogs.com/xujiahui/p/6025830.html 不足之处望见谅. 之三: 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringE

iOS知识点、面试题 之二

最近面试,发现这些题个人约到的几率打一些,与大家分享一下,分三文给大家: 当然Xcode新版本区别,以及iOS新特性 Xcode8 和iOS 10 在之前文章有发过,感兴趣的可以查阅: http://www.cnblogs.com/xujiahui/p/6025830.html 不足之处望见谅. 之二: 1.怎么样适配ios系统和ios屏幕 ios适配系统代码写法[[UIDevice currentDevice] systemVersion] 和NSFoundationVersionNumber