A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© heiHorse 中级黑马   /  2015-11-5 21:02  /  811 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

25、字符串

-(BOOL) isEqualToString: (NSString*) s

比较两个字符串是否相等,与JAVA 一致的地方是==比较指针,比较对象是否相同要用到equal 方法。

-(NSMutableString*) appendString: (NSString*) s

这与JAVA 的StringBuffer 的append 没什么区别。
26、数组

Cocoa 使用NSArray 表示数组,但是它不能存储基本数据类型、enum、struct、nil,只能存储Objective-C 的对象。

NSArray *array=[NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];

从这个类方法arrayWithObjects 的定义可以看出,它使用nil 表示数组元素结束,这也是nil 不能存储在NSArray 中的原因。

NSMutableArray 为长度可变的数组,相当于JAVA 中的List:

NSMutableArray *mArray=[NSMutableArray arrayWithCapacity: 10];

[mArray addObject: @"Apple"];//添加数组元素

NSEnumerator *e = [mArray objectEnumerator];//获取数组的迭代器,相当于JAVA 中的Iterator,reserveObjectEnumerator 用于获取反转之后的数组迭代器。与JAVA 一致的地方是你在使用迭代器时,不能对数组进行添加、删除操作。

for(NSString *ms in mArray){

NSLog(@"%@",ms);

}

//for-each 快速枚举为Objective-C 2.0 的新特性,Windows 上的GNUStep 并不支持。
27、字典(哈希表)

NSDictionary 用于存储key-value 的数据结构,与JAVA 中的Map 类似。

NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys: @"Apple", @"A", @"Google",@"G", nil];//dictionaryWithObjectAndKeys 后的可变参数,每两个为一个value-key,以nil 表示结束。

NSLog(@"%@",[dic objectForKey: @"A"]);//按照指定的key 查询value

同样的有NSMutableDictionary 表示长度可变的字典。

NSMutableDictionary *mDic=[NSMutableDictionary dictionaryWithCapacity: 10];

[mDic setObject: @"Apple" forKey: @"A"];//添加value-key 对

for(id key in mDic){

NSLog(@"%@ : %@",key,[mDic objectForKey: key]);

}

//快速迭代的for-each 循环



28、哈希Set

NSSet 表示以hash 方式计算存储位置的集合,与JAVA 中的HashSet 是一致的。在NSSet 中的每个对象都有一个唯一的hash 值,重复的对象将只能保留一个。因此,这引出了Objective-C中的对象比较问题,这需要你实现从NSObject 继承而来的如下两个方法:

- (BOOL) isEqual: (id) anObject;

- (NSUInteger) hash;

这与JAVA 的对象比较没有什么区别,两个相等的对象必须有相同的hashCode,所以这两个方法必须同时实现。

同样的,NSMutableSet 表示长度可变的哈希Set。

29、封装类(相当于java的包装器)

前面的几个容器类的对象都不能存放基本数据结构、enum、struct、nil,怎么办呢?在JAVA中我们知道所有的基本数据类型都有对应的封装类,例如:int---Integer、boolean---Boolean,使用封装类可以把基本数据类型包装为对象,而封装类本身又有方法可以返回原来的基本数据类型。Cocoa 使用NSValue 作为封装类。

NSRect rect=NSMakeRect(1,2,30,50);//这个是在前面提到过的一个表示矩形的结构体

NSValue *v=[NSValue valueWithBytes: &rect objCType: @encode(NSRect)];

/<IMG title="java 与oc之间的比较" alt="java 与oc之间的比较" SYSFACE="79">alueWithBytes 要求传入包装数据的地址,也就是变量中存储的数据的首地址,我们依然使用C 语言的&作为地址运算符,计算指针存储的首地址。

//objCType 要求传入用于描述数据的类型、大小的字符串,使用@encode 指令包装数据所属的类型。



NSMutableArray *mArray=[NSMutableArray arrayWithCapacity: 3];

[mArray addObject: v];

NSRect rect2;

[[mArray objectAtIndex: 0] getValue: &rect2];

//NSValue 的-(void) getValue: (void*) value 方法可以将NSValue 中的数据内容取出,要求传入的参数是一个指针,也就是说getValue 方法将你传入的指针指向存储的数据。

//一般Cocoa 中的getXXX 方法都是这个作用,这也是为什么前面的getter 方法不要以get作为方法前缀的原因。

对于基本数据类型,你可以使用简便的NSNumber 来封装,它是NSValue 的子类。

如果你想存储空值到集合类,可以使用NSNull,它使用NSNull *n =[NSNull null];的方式创建。



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马