• 从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用


    当你着手为你的应用编写代码的时候,你会发现有很多可供使用的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 "
    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”关注我们!

  • 相关阅读:
    CentOS7 1 安装 ansible
    CentOS7 prometheus +node_exporter+Grafana 配置篇(原创)
    CentOS7 prometheus +node_exporter+Grafana 安装篇
    Oracle 查询重复记录 只保留一条 (转载)
    MySQL 查询重复数据(转载)
    Mongodb 查询重复数据(转载)
    Python报错:pymongo.errors.CursorNotFound: Cursor not found
    百万级高并发MongoDB集群性能数十倍提升优化实践(上篇)
    OPPO百万级高并发mongodb集群性能数十倍提升优化实践(下篇) 转载
    Oracle 常见等待事件及处理方法
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10626792.html
Copyright © 2020-2023  润新知