Chapter 15 Numbers, Strings, and Collections

Foundation.h几乎包含了所有你需要的framework头文件,并且XCode会自动添加该头文件,所以这个无需你自己写。
NumberObjects
NSNumber类可以让你用内置数值类型生成数值对象。
NS:Next Step。
NSNumber通过用调用初始化方法来把内置类型数字转换成数值对象。
这个数值对象只能还原成原内置数值类型。
P314中表15.1列举了把内置数值类型转换成数值对象的初始化方法、实例方法和还原方法。
NSNumber对象一旦被初始化就不能再被更改,否则会出现运行时错误。
涉及到integer的,在还原以后,你还要把它强制转换成long才能显示或者用于格式化字符串。
针对于NSNumber,Objective-C新增加了一项语法,它可以使内置数值类型转换成数值对象更加方便,如下图所示:

Chapter 15 Numbers, Strings, and Collections_第1张图片

其语法为@expression,所以你也可以这样写:

StringObjects

这不是简单的string而是一个string对象,处理string对象的类是NSString。说得确切一些像上图这样的常量字符串归属于NSConstantString类,而它是NSString的子类。
NSString中的字符是由unichar类型组成的,一个unichar字符是Unicode类型的多字节字符。
More on the NSLog Function
unichar目前占用2bytes,因为Unicode占用的字节数目前还没有上限,所以unichar将来会占用多少空间谁也说不准。

你可以像上图那样给一个NSString对象初始化,并用%@把它打印出来。
%@不仅可以用于NSString对象而且还可以用于其他对象。
The description Method
%@还可以用于格式化输出数组、词典和集合。
description可以打印你自己类的对象,但前提是你必须重写,因为它是从NSObject继承而来的,如果你不重写,它只会默认打印类名和对象地址。
重写的方式如下所示:

重写description方法是一种很好的调试手段。
Mutable Versus Immutable Objects


这样的属于immutable对象,即不变对象。
NSString用于处理immutable对象。
与之相对应的就是NSMutableString,它用来处理可变字符串。
NSstring的stringWithString方法可以实现字符串的真正复制,即用一个字符串对象生成另一个同样内容的字符串对象。
stringByAppendingString是生成一个新的字符串对象这个字符串对象的内容是原来两个字符串连接在一起形成的。
isEqualToString用来测试两个字符串对象的内容是否相同。
compare方法用于判断两个字符串对象的大小关系。NSOrderedAscending、NSOrderedSame和NSOrderedDescending是3个宏,它们分别是两个字符串比较以后的结果,对应第一个字符串对象比第二个字符串对象小、相等、大。
compare方法区分大小写,caseInsensitiveCompare则是不区分大小写的比较方法。
uppercaseString和lowercaseString分别把字符串转换成小大写的形式,但是它们都不是在源字符串基础上进行转换的,可想而知它们也是重新生成了字符串对象。
你也可以通过指定一个范围来操作子串,这个范围是由起始下标+偏移量组成的。NSString中的一些方法使用NSRange来创建该范围,NSRange实际上一个具有location和length项的结构体的typedef。
substringtoIndex生成一个子串,它接收一个下标作为参数,但是生成的子串不包含下标所指代的那个字符,它的作用是生成一个从第1一个字符到指定下标之前一个字符的子字符串。

substringFromIndex生成一个从指定字符开始直到原字符串结束的子字符串。


substringwithRang它接收一个范围作为参数,这个范围就是NSMakeRange(location,length)。
rangeOfString用于查找子串,找到的话就返回找到的地方,否则返回NSNotFound,NSNotFound是NSRange的location,rangeOfString返回的是结构体NSRange。
MutableStrings
可以用NSMutableString来创建可变字符串对象,它可以是NSString的子类。
下面的方法都是在原字符串基础上的更改。
insertString:atIndex:它是在atIndex指定的下标之后插入一个字符串。
appendString用衔接两个字符串。
deleteCharactersInRange把一个指定范围的字符串从原字符串删除。

rangeOfString用于判断子串是不是在原字符串中,即判断子串在原字符串中出现的第一个位置。
setString可直接设置可变字符串对象内容。
replaceCharactersInRange:withString:用于把某些字符用指定字符串代替,如下图所示:

replaceOccurrencesOfString:withString:options:range:该方法完成了搜索和替代目标字符串的目的,其用法如下:

P331中的表15.2列出了NSString类中常用的字符串操作方法。
NSString中的url其实是NSURL对象,而不是NSString字符串。
path和nsstring是NSString对象。
i、size、opts是NSUIntegers对象。
err是NSError对象。
range是NSRange结构体。
P332中的表15.3列出了常用的NSMutableString方法。
ArrayObjects
数组也有mutable和immutable两种。
NSArray类控制着immutable数组,NSMutableArray类控制着mutable数组。
NSMutableArray是NSArray的子类。
定义一个immutable数组的形式如下所示:
Chapter 15 Numbers, Strings, and Collections_第2张图片

arrayWithObjects:用于根据参数创建一个数组对象,整个数组必须以nil结尾,虽然它不占存储空间。
整个数组对象是个符合的对象,它包含了若干个字符串对象,引用某个字符串对象的方法是objectAtIndex:如下图所示:

Objective-C允许你用简单的方式创建对象的NSArray,如下图所示:

这种情况你没有必要再显式地添加一个nil。
Objective-C也允许你这样引用数组元素:

你也可以这样赋值:

它和下面这条语句是等效的:

给数组元素赋一个数值对象的形式如下所示:

这就把一个普通的内置类型的数字变成了数字对象,所以@(n)是数字对象。
NSMutableArray实际上创建的是动态的数组,它大小不确定,按需增减。array能够创建一个新的空的NSMutableArray对象。
addObject用于把一个对象添加到NSMutableArray数组的结尾,如下图所示:

%@之所以能够打印不同类型的对象,是因为它是根据对象所属类和对象的地址,然后NSLog使用相应的description方法来打印对象信息。
Makingan Address Book

在@property段中有这样两个属性copy和nonatomic。
copy以为着在setter存取其中真正地复制一份实例变量,而不是简简单单地地址的复制。
nonatomic,非原子,这个属性意味着你不用担心在多线程环境下同一时间多个线程对同一变量的写操作。不过按理来说只有原子操作才不会被别的线程乱入啊,这个属性名称是不是启错了?

strong的作用是在你使用setter存取器的时候对实例对象增加一个额外的引用,这会影响对象的生存期。
FastEnumeration
这个有点像foreach语句,它就是顺序地遍历一个数组的所有元素而已。

很简单,这里book是一个数组,它是AddressCard类型的,于是你声明了一个AddressCard类型的对象来遍历book中的元素,其中in是关键字。
如果用于遍历的变量已经被声明过了,那你可以以如下方式使用:

enumerateObjectsUsingBlock:从这个方法名就可以看得出来,它也是用来快速变量对象数组元素的。
数组中的元素作为参数传入该方法,此外,它还接收一个下标和bool变量用于标识执行停止的位置。
Chapter 15 Numbers, Strings, and Collections_第3张图片

从这个图可以看出来它接收的是整个一个block。
Sorting Using Blocks
P359中的表15.4列出了操作对象数组的一系列方法。
P360中的表15.5列出了NSMutableArray数组的操作方法。
The NSValue Class
如果你想用容器来存储非对象,比如内置类型,结构体什么的,那你需要先把这些转换成对象再存储,这个过程叫包装,其逆过程叫拆包。
P361中表15.6列出了一些包装和拆包的方法。
它的用法示例如下:
Chapter 15 Numbers, Strings, and Collections_第4张图片


DictionaryObjects
它有点像map,也是个键值对的容器,只不过这个值是对象而已,即,你可以通过key来查找某个对象。
key是独一无二的,它可以是任何对象类型,但一般来讲是字符串类型。
object也可以是任何对象类型,但是不能是nil。
dictionary也有mutable和immutable之分,program15.16显示了按照key插入内容和按照key来输出内容的操作,这是个mutable的dictionary。
[NSMutableDictionary dictionary]能创建一个空的dictionary,setObject:forKey:能向dictionary中添加键值对,objectForKey:按照key来检索值。
此外,dictionary还提供了一些方便的操作方法类似于数组。
dict[key]等同于[dict objectForKey: key]。
dict[key] = object等同于[dict setObject: object forKey:key]
Enumeratinga Dictionary
dictionary里面的键值对是无序的。
你可以像定义数组一样定义一个dictionary,如下图所示:
Chapter 15 Numbers, Strings, and Collections_第5张图片

最后面应该有一个nil,图中是3组键值对,每组第二个是key,第一个是object。
你可以像这样来打印这些,如下图所示:

另一种定义dictionary的方法是使用对,如下图所示:

Chapter 15 Numbers, Strings, and Collections_第6张图片

因为dictionary里面的键值对是无序的,如果你想得到有序的键值对就必须首先把键值对提取出来排序,抽取key的方法是NSDIctionary’s allKeys。
排序的方法如下:
Chapter 15 Numbers, Strings, and Collections_第7张图片

NSMutableDictionary是NSDictionary的子集。
P366中的表15.7列出了immutable dictionary的常用操作方法,而表15.8列出了mutable dictionary中常用的操作方法。
SetObjects
这个set是集合的意思不是设置。
set是一系列独一无二的对象的集合,它可以是mutable也可以是immutable的。
与set相关的有3个类——NSSet、NSMutableSet、NSIndexSet,NSMutableSet是NSSet的子类。
定义set的方法如下所示:

setWithObjects:用于创建一个以nil结尾集合。
isEqualToSet:用于测试两个集合是否相同。
containsObject:用于判断某元素是否在集合中。
addObject:向集合中添加元素。
removeObject:从集合中删除元素。
intersect:用于计算交集,union:用于计算并集。
NSCountedSet用于含有多个相同元素的集合,但实际上并不是具有多个相同的元素,而是为每个元素维持一个计数器而已,添加进一个相同的元素计数器+1,删除一个相同的元素计数器-1,直到相同元素没有了才真正删除该元素。
retrieves用于查找某个元素的个数。
P370中表15.9列出了NSSet中的常用方法。
P371中表15.10列出了NSMutableSet中常用的方法。
NSMutableSet是NSSet的子类。
NSIndexSet
它用来把索引,其实我感觉就是下标,存储进某种数据结构中,一般是数组。
它没有mutable版本。
NSArray中的indexOfObjectPassingTest:接受一个块作为参数,它把下标数字放进数组的每个元素中,此外还有一个bool型的指针。
P373中表15.11显示了常用的NSIndexSet方法。

你可能感兴趣的:(Chapter 15 Numbers, Strings, and Collections)