当你着手为你的应用编写代码的时候,你会发现有很多可供使用的Objective-C的框架类,当中尤其重要的就是基础框架类。它为平台全部的应用提供基础服务。基础框架类中包括了表示字符串和数字等基本数据类型的值类(value classes),也实用来存储其它对象的集合类(collection classes)。你将会依赖值类和集合类为你的ToDoList app编写大量代码。
值对象(Value Objects)
 
Foundation框架提供了生成字符串、二进制数据、日期和时间、数字以及其它值对象的类。

 
值对象封装了C语言中的基本数据类型。并提供针对相应数据类型操作的方法。在程序调用中,你会经常遇到将值对象作为參数或返回值的方法和函数。框架中的不同部分,乃至不同框架之间都能够通过值对象类传递数据。

 
Foundation框架中值对象的样例:
• NSString and NSMutableString 
• NSData and NSMutableData 
• NSDate 
• NSNumber 
• NSValue 
 
由于值对象代表的是标量值,你能够在集合类和其它不论什么须要的类中使用它们。相比它封装的基元数据,值对象能够让你更简单高效地操作它封装的值。以NSString类为例。它包括了查找替换子字符串、把字符串写入文件或URL、利用字符串构建文件系统路径等方法。
 
你能够用基元数据创建一个值对象(假设有必要的话,将其作为參数传递给某一方法)。之后就能够通过该对象来訪问被封装的数据。下面以NSNumber类来演示说明以上创建值对象的方法。

  1. int n = 5; // Value assigned to primitive type 
  2. NSNumber *numberObject = [NSNumber numberWithInt:n]; // Value object created from primitive type 
  3. int y = [numberObject intValue]; // Encapsulated value obtained from value object (y == n) 
 
大多数值类通过声明初始化器和类工厂方法来创建它们的实例。类工厂方法能够完毕实例的分配和初始化。返回一个被创建的对象。

比如,NSString类声明了一个string类方法。能够分配并初始化该类的一个新实例。并作为返回值返回给你的代码使用。


  1. NSString *string = [NSString string]; 
 除了创建值对象,并让你訪问它们封装的值,多数值类都提供了诸如对象比較之类的简单操作方法。
 
字符串
Objective-C支持同C语言一样的惯例来指定字符串:通过单引號表示单个字符,双引號表示字符串,可是Objective-C框架一般不使用C字符串,它们通常使用NSString对象。
 
NSString类提供了一个字符串的封装,具有下面优势:内置内存管理功能能够存储任意长度的字符串、支持不同的字符编码(尤其是Unicode)以及字符格式化的方法。由于你经常会用到这种字符串,所以Objective-C提供了一种从常量值创建NSString对象的简便方法。想要使用该常量,可在字符串的双引號前面加一个@符号就可以,例如以下例所看到的。

  1. // Create the string "My String" plus carriage return. 
  2. NSString *myString = @"My String\n"; 
  3. // Create the formatted string "1 String". 
  4. NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"]; 
  5. // Create an Objective-C string from a C string. 
  6. NSString *fromCString = [NSString stringWithCString:"A C string" encoding:NSUTF8StringEncoding]; 
 
数字
Objective-C为创建NSNumber对象的提供了简化符号,除去了调用初始化器或者类工厂方法创建这些对象的须要。

仅仅需简单地在数值前面加@符号就可以,你还能够在数值之后加一个类型指示符。比方,想要创建一个封装了整数值和双精度值的NSNumber对象。你须要编写例如以下代码:


  1. NSNumber *myIntValue    = @32; 
  2. NSNumber *myDoubleValue = @3.22346432; 
你甚至能够使用NSNumber常量来创建封装布尔类型和字符类型的对象,例如以下所看到的:

  1. NSNumber *myBoolValue = @YES; 
  2. NSNumber *myCharValue = @'V'; 
你能够通过U、L、LL、和F后缀来创建分别代表无符号整型、长整型、超长整型和浮点类型的NSNumber对象。例如以下代码演示样例创建了一个封装了浮点值类型的NSNUmber对象:

  1. NSNumber *myFloatValue = @3.2F; 
 
集合对象
 
Objective-C中的大部分集合对象都是NSArray、NSSet和NSDictionary这些基本集合类的实例。

这些类用来管理群组对象,所以你加入到集合中的实例必须为一个Objective-C类。假设你须要加入标量数值,你必须创建一个合适的NSNumber或NSValue实例来代表它。

 
在集合被销毁前,集合中存储的成员对象不能被销毁。这是由于集合类採用强引用来维护它的成员对象。除了跟踪维护它对象外,集合类还提供枚举、訪问特定对象、推断某一对象是否在集合内等功能。
 
NSArray, NSSet和 NSDictionary类的内容在集合创建时即被初始化,之后在使用中不能再被改变,这种类叫不可变类。

每一个集合类都有一个可变的子类同意你任意加入删除成员对象。不同集合类组织它们成员对象的方式是不同的:

• NSArray和NSMutableArray—存储有序对象的数组。你能够通过在数组中指定位置来訪问一个成员对象。数组中第一个元素的索引为0。
• NSSet和NSMutebleSet—存储无序对象的集合。每一个元素在集合中具有唯一性。你仅仅能通过測试或筛选的方法来訪问集合中的对象。
• NSDictionary和NSMutableDictionary—通过键值对存储的一个词典。

键是一个独特的标识符。一般是一个字符串。值就是你想要存储的对象。

你能够通过指定键来訪问该对象。

 
数组
数组(NSArray)用来表示一组有序对象。唯一的要求是每一个对象必须是一个Objective-C对象,至于每一个对象是不是同一个类的实例没有要求。
 
为了维护数组的有序性,元素的索引从0開始,例如以下图所看到的:
创建数组
与本章前面介绍的值类同样。你能够通过分配和初始化、工厂方法或者数组常量来创建一个数组。依据对象个数的不同。有非常多初始化和工厂方法可供使用:

  1. + (id)arrayWithObject:(id)anObject; 
  2. + (id)arrayWithObjects:(id)firstObject, ...; 
  3. - (id)initWithObjects:(id)firstObject, ...; 
由于arrayWithObjects:和initWithObjects:方法都是可变參数长度并以nil结束,初始化例如以下代码所看到的:

  1. NSArray *someArray = 
  2. [NSArray arrayWithObjects:someObject, someString, someNumber, someValue, nil]; 
上例创建了一个与之前相似的数组。当中第一个对象someObject的索引值是0,最后一个对象someValue的索引值是3。
 
假设中间某一个值是nil。数组可能会被截断。

  1. id firstObject = @"someString"; 
  2. id secondObject = nil; 
  3. id thirdObject = @"anotherString"; 
  4. NSArray *someArray = 
  5.   [NSArray arrayWithObjects:firstObject, secondObject, thirdObject, nil]; 
本例中,someArray仅仅包括firstObject。由于secondObject的值是nil。因此被当作数组的结束符。
 
能够使用例如以下简便的语法来创建一个数组常量:

  1. NSArray *someArray = @[firstObject, secondObject, thirdObject]; 
当使用这个语法是。不要用nil来结束对象列表,实际上,nil是一个不存在的值。

比如,你在执行下面代码时会得到一个执行异常:


  1. id firstObject = @"someString"; 
  2. id secondObject = nil; 
  3. NSArray *someArray = @[firstObject, secondObject]; 
  4. // exception: "attempt to insert nil object" 
 
 查询数组对象
创建完数组之后,你能够查询当中个的信息,比方它包括多少对象。或它是否包括某一给定对象。

  1. NSUInteger numberOfItems = [someArray count]; 
  2.   
  3. if ([someArray containsObject:someString]) { 
  4.     ... 
你还能够通过一个给定的索引来查询数组的项目。假设尝试请求一个不存在的索引,那么执行时你将得到一个越界异常。为了防止异常。在使用前请首先检查数组中项目的个数。


  1. if ([someArray count] > 0) { 
  2.     NSLog(@"First item is: %@", [someArray objectAtIndex:0]); 
本样例检查了对象个数是否大于零,假设是。Foundation框架函数NSLog输出一个数组中第一个元素的说明。它的索引为0。

 
第二种方法是使用objecAtIndex。你还能够像C语言那样,使用方括号语法查询数组元素,上一个样例还能够写成这样:

  1. if ([someArray count] > 0) { 
  2.     NSLog(@"First item is: %@", someArray[0]); 
 
数组对象排序 
NSArray类为对象排序提供了一系列方法。由于NSArray是不可变的。因此这些方法会返回一个包括排序后对象的新数组。

 
比如,你能够通过对每一个字符串调用compare:方法来排序字符串数组:

  1. NSArray *unsortedStrings = @[@"gammaString", @"alphaString", @"betaString"]; 
  2. NSArray *sortedStrings = 
  3.          [unsortedStrings sortedArrayUsingSelector:@selector(compare:)]; 
 
可变性
虽然NSArray类本身是不可变的,可是它能够包括可变对象,比如,你能够在不可变数组中加入一个可变字符串,例如以下所看到的:

  1. NSMutableString *mutableString = [NSMutableString stringWithString:@"Hello"]; 
  2. NSArray *immutableArray = @[mutableString]; 
于是你能够任意改变字符串的内容。


  1. if ([immutableArray count] > 0) { 
  2.     id string = immutableArray[0]; 
  3.     if ([string isKindOfClass:[NSMutableString class]]) { 
  4.         [string appendString:@" World!"]; 
  5.     } 
假设想在数组创建后加入或删除数组中的对象,你能够使用NSMutableArray,该类加入了一系列方法来加入删除、替换一个或多个对象。

  1. NSMutableArray *mutableArray = [NSMutableArray array]; 
  2. [mutableArray addObject:@"gamma"]; 
  3. [mutableArray addObject:@"alpha"]; 
  4. [mutableArray addObject:@"beta"]; 
  5.   
  6. [mutableArray replaceObjectAtIndex:0 withObject:@"epsilon"]; 
本演示样例创建了一个由对象@"epsilon", @"alpha"和 @"beta"组成的数组。

对于可变数组,你能够在不生成新数组的情况下对数组进行排序,例如以下所看到的:


  1. [mutableArray sortUsingSelector:@selector(caseInsensitiveCompare:)]; 
本例中,数组元素按升序排列,不区分大写和小写。
 
集对象与数组相似,可是它包括的是无序互异对象。
由于集是无序的。因此在測试成员对象时性能比数组要好。集是不可变的。因此它的内容必须在创建时指定。

  1. NSSet *simpleSet = 
  2.   [NSSet setWithObjects:@"Hello, World!", @42, aValue, anObject, nil]; 
同NSArray类一样,initWithObjects:和setWithObjects:方法是可变长度的參数,必须以nil结束。

NSSet的可变子类是NSMutableSet。

 
每一个对象集仅仅存储一次,即使你不止一次加入一个对象。


  1. NSNumber *number = @42; 
  2.    NSSet *numberSet = 
  3.      [NSSet setWithObjects:number, number, number, number, nil]; 
  4.    // numberSet only contains one object 
 
词典
与简单的维护一个有序或无序的集合对象不同。词典(NSDictionary)使用给定键值对存取对象,它能够被用于检索。通常使用字符串对象作为字典的键。
虽然你能够使用其它对象作为键,可是请记住每一个键是被拷贝到字典中的。因此该对象必须支持NSCopying方法。然而,假设你想要使用键值对编码,你必须使用string key作为词典对象(详情请參见Key-Value
Coding Programming Guide
)。
 
创建词典
你能够使用alloc和初始化,或类的工厂方法来创建词典,例如以下所看到的:

  1. NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
  2.                someObject, @"anObject", 
  3.          @"Hello, World!", @"helloString", 
  4.                       @42, @"magicNumber", 
  5.                 someValue, @"aValue", 
  6.                       nil]; 
对于 dictionaryWithObjectsAndKeys: 和 initWithObjectsAndKeys: 方法。每一个对象必须在键前面声明,并以nil结束。 
 
Objective-C为词典常量创建提供了简便语法: 

  1. NSDictionary *dictionary = @{ 
  2.               @"anObject" : someObject, 
  3.            @"helloString" : @"Hello, World!", 
  4.            @"magicNumber" : @42, 
  5.                 @"aValue" : someValue 
  6. }; 
对于字典常量,键在对象前指定,而且列表对象和键无需以nil结束。

 
查询词典
创建词典之后。你能够查询键相应的对象,例如以下所看到的:

  1. NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"]; 
假设对象未找到, objectForKey: 方法会返回 nil. 
 
除了objectForKey:方法,你还能够使用例如以下方法进行查询: 

  1. NSNumber *storedNumber = dictionary[@"magicNumber"]; 
 
可变性
假设你须要在词典创建后加入或者删除内容,请使用NSMutableDictionary 类。

  1. [dictionary setObject:@"another string" forKey:@"secondString"]; 
  2. [dictionary removeObjectForKey:@"anObject"]; 
 
使用 NSNull表示nil
你不能将nil加入到本节描写叙述的集合类中,由于nil在Objective-C 中代表“不存在的对象”,假设你须要在集合中表示一个不存在的对象,请使用NSNull类。

  1. NSArray *array = @[ @"string", @42, [NSNull null] ]; 
在NSNull中。null方法总是返回同一个实例,具有这样行为的类被称为“骨架类”( singleton classes)。你能够使用下面方法检查一个对象是否等于NSNull:

  1. for (id object in array) { 
  2.     if (object == [NSNull null]) { 
  3.         NSLog(@"Found a null object"); 
  4.     } 
虽然Foundation框架包括的功能比此处描写叙述的要多非常多,但你不须要如今就掌握其每一个细节。假设你想要了解很多其它Foundation框架知识,请參看Foundation
Framework Reference
。眼下你已掌握足够的信息来继续实现ToDoList这个应用,为了实现它你须要写一个自己定义数据类。
 

CocoaChina是全球最大的苹果开发中文社区。官方微信每日定时推送各种精彩的研发教程资源和工具。介绍app推广营销经验,最新企业招聘和外包信息,以及Cocos2d引擎、Cocostudio开发工具包的最新动态及培训信息。

关注微信能够第一时间了解最新产品和服务动态,微信在手,天下我有!

请搜索微信号“CocoaChina”关注我们!

从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用的更多相关文章

  1. 開始学习swift开发

    近期要開始学习swift开发了,接下来的日子,会记录学习swift的历程.

  2. 从零開始学习OpenCL开发(一)架构

    多谢大家关注 转载本文请注明:http://blog.csdn.net/leonwei/article/details/8880012 本文将作为我<从零開始做OpenCL开发>系列文章的 ...

  3. 【React Native开发】React Native配置执行官方样例-刚開始学习的人的福音(8)

    ),React Native技术交流4群(458982758),请不要反复加群! 欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文 ...

  4. iOS开发--iOS及Mac开源项目和学习资料

    文/零距离仰望星空(简书作者)原文链接:http://www.jianshu.com/p/f6cdbc8192ba著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 原文出处:codecl ...

  5. 開始学习swift,资料汇总帖

    最近開始学习swift,以后mac和ios开发就指望它,曾经学oc半途而废了.主要原因是oc等语法实在能适应,如今有swift了.语法有js,scala,python,c++,oc等语言的影子,又一次 ...

  6. iOS开发之窥探UICollectionViewController(五) --一款炫酷的图片浏览组件

    本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectio ...

  7. 精通iOS开发(第5版)

    <精通iOS开发(第5版)> 基本信息 原书名:Beginning ios 6 development:exploring the ios sdk 作者: (美)David Mark   ...

  8. wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...

  9. wxWidgets刚開始学习的人导引(2)——下载、安装wxWidgets

    wxWidgets刚開始学习的人导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxS ...

随机推荐

  1. PIE 支持项目介绍

    目前PIE SDK已经支持了气象.海洋.农业.水利.测绘等多个行业应用. [气象应用-和WebGIS程序界面结合] [气象应用-积雪监测] [气象应用-洪涝监测] [气象应用-专题模板] [气象应用- ...

  2. Merge Sorted Array II

    Merge two given sorted integer array A and B into a new sorted integer array. Example A=[1,2,3,4] B= ...

  3. 重入锁--ReentrantLock

    本部分主要参考<java并发编程艺术>一书相关内容,同时参考https://blog.csdn.net/zhilinboke/article/details/83104597,说的非常形象 ...

  4. TOJ 1258 Very Simple Counting

    Description Let f(n) be the number of factors of integer n. Your task is to count the number of i(1 ...

  5. 数据库SQL优化百万级数据库优化方案

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  6. 细说C#中的序列化与反序列化的基本原理和过程

    虽然我们平时都使用第三方库来进行序列化和反序列化,用起来也很方便,但至少得明白序列化与反序列化的基本原理. 懂得人就别看了! 注意:从.NET Framework 2.0 开始,序列化格式化器类Soa ...

  7. python实现查询的数据写入到excel

    #coding=utf-8import sysimport xlwtimport pymysql as MySQLdb #这里是python3 如果你是python2.x的话,import MySQL ...

  8. Spring Chapter4 WebSocket 胡乱翻译 (一) 一个例子

    因为没有基础,不知道从哪里入手. 文档里的例子,https://github.com/rstoyanchev/spring-websocket-portfolio,这个除了WebSocket,还整了S ...

  9. C++里创建 Trie字典树(中文词典)(三)(联想)

    萌新做词典第三篇,做得不好,还请指正,谢谢大佬! 今天把词典的联想做好了,也是比较low的,还改了之前的查询.遍历等代码.  Orz 一样地先放上运行结果: test1 ID : char : 件 w ...

  10. javascript: iframe switchSysBar 左欄打開關閉,兼容各瀏覽器操作

    <html> <head> <meta content="text/html; charset=utf-8" http-equiv="Con ...