zoukankan      html  css  js  c++  java
  • OC Foundation Kit

    Cocoa由两个不同的框架组成:Foundation Kit和Application Kit。

    Application Kit包含了所有的用户接口对象和高级类。

    Foundation Kit有很多有用的、面向数据的低级类和数据类型。

    一些有用的数据类型:

    1、范围NSRange

    typedef struct _NSRange{

      unsigned int location;

      unsigned int length;

    }NSRange;

    这个结构体用来表示相关事物的范围,通常是字符串里的字符范围或者数组里的元素范围。

    location字段存放该范围的起始位置,而length字段是该范围内所含元素的个数。

    可以用3种方式创建新的NSRange。

    1)直接给字段赋值:

    NSRange range;

    range.location=17;

    range.length=4;

    2)使用C语言的聚合结构赋值机制,大括号列表初始化。

    NSRange range={17,4};

    3)使用Cocoa提供的一个快捷函数NSMakeRange()

    NSRange range=NSMakeRange(17,4);

    使用NSMakeRange()的好处是可以在任何能够使用函数的地方使用它。

    location字段未被初始化时是NSNotFound,表示无意义范围。

    2、几何数据类型

    几种用来处理几何图形的数据类型,如NSPoint和NSSize。

    NSPoint代表的是笛卡尔平面中的一个点:

    typedef struct _NSPoint{

      float x;

      float y;

    }NSPoint;

    NSSize用来存储长度和宽度:

    typedef struct _NSSize{

      float width;

      float height;

    }NSSize;

    NSRect矩形数据类型:

    typedef struct _NSRect{

      NSPoint origin;

      NSSize size;

    }NSRect;

    Cocoa也提供了创建这些数据类型的快捷函数:NSMakePoint()、NSMakeSize()和NSMakeRect()。

    3、字符串NSString

    创建字符串:

    NSString的stringWithFormat:方法就是这样通过格式字符串和参数来创建NSString的:

    + (id) stringWithFormat: (NSString *) format, ...;

    NSString *height;

    height=[NSString stringWithFormat: @"my height is %d", 150];

    stringWithFormat: 的声明中有两个值得讨论的地方。第一个是定义最后的省略号(...),它告诉我们和编译器这个方法可以接收多个以逗号隔开的其它参数

    另一个重要的地方是stringWithFormat: 的开始字符:一个加号。

    OC在运行时生成一个类的时候,它会创建一个代表该类的类对象。类对象包含了指向超类的指针、类名和指向类方法列表的指针。类对象还包含一个long型数据,为新创建的类实例对象指定大小(以字节为单位)

    如果在声明方法时添加了加号,那么就是把这个方法定义为类方法。这个方法属于类对象(而不是类的实例对象)并且通常用于创建新的实例。称这种用来创建新对象的类方法为工厂方法。

    NSString中另一个方便的实例方法是length,它返回的是字符串中的字符个数。

    - (unsigned int) length;

    unsigned int len=[height length];

    字符串的比较:

    isEqualToString: 可以用来比较接收方(接收消息的对象)和当作参数传递来的字符串。isEqualToString: 返回一个BOOL(YES或NO)型数据来表示两个字符串的内容是否相同。

    原型: - (BOOL) isEqualToString: (NSString *) aString;

    使用:

    NSString *thing1=@"hello";

    NSString * thing2;

    thing2=[NSString stringWithFormat: @"hello"]

    if ([thing1 isEqualToString: thing2]){...}    //if(thing1 == thing2)//这是对指针值进行比较

    要比较两个字符串,可以使用compare:方法。

    原型:- (NSComparisonResult) compare: (NSString *) string;

    compare:将接收对象和传递来的字符串逐个字符进行比较,它返回一个NSComparisonResult(一个enum型数据)来显示比较结果。

    typedef enum _NSComparisonResult{

      NSOrderedAscending = -1,

      NSOrderedSame,

      NSOrderedDescending

    }NSComparisonResult;

    compare是进行大小写区分比较的。

    还有一个方法compare: options: ,这个方法能给我们更多的控制权

    原型:- (NSComparisonResult) compare: (NSString *) string options: (unsigned) mask;

    options参数是一个位掩码,可以使用位或运算符(|)来添加选项标记。

    一些常用的选项如下:

    1)NSCaseInsensitiveSearch:不区分大小写字符。

    2)NSLiteralSearch:进行完全比较,区分大小写。

    3)NSNumericSearch:比较字符串的字符个数,而不是字符串。

    字符串内是否还包含别的字符串:

    - (BOOL) hasPrefix: (NSString *) aString;

    - (BOOL) hasSuffix: (NSString *) aString;

    分别判断前缀后缀。

    判断字符串中是否包含子串。

    - (NSRange) rangeOfString: (NSString *) aString;

    将rangeOfString传递给一个字符串时,参数是一个子串,返回值是这个子串在原字符串中的范围NSRange。如果不存在,则NSRange的location是NSNotFound。NSNotFound是-1。

    4、可变性

    NSString是不可变的,这并不意味着不能操作它们。不可变的意思是一旦NSString被创建了,我们就不能改变它。不能以删除字符或添加字符的方式来改变它。

    Cocoa提供了一个NSString的子类,叫做NSMutableString。如果想改变字符串,可以使用这个子类。

     可以使用类方法stringWithCapacity: 来创建一个新的NSMutableString,

    + (id) stringWithCapacity: (unsigned) capacity;

    这个容量只是给NSMutableString的一个建议,字符串的大小并不仅限于提供的容量,这个容量仅是最优值。(类似C++的vector)。

    NSMutableString *str;

    str=[NSMutableString stringWithCapacity: 42]  //

    一旦有了一个可变字符串,就可以对它进行各种操作了。一种常见的操作是通过appendString:或appendFormat: 来附加新字符串。

    - (void) appendString: (NSString *) aString;

    - (void) appendFormat: (NSString *) bString, ...;

    appendString接收参数aString将其添加到接收对象的末尾。appendFormat的工作方式与stringWithFormat: 类似,但它将格式化的字符串附加在接收字符串的末尾,而不是创建新的字符串对象。

    可以用deleteCharactersInRange: 方法删除字符串中的字符。

    - (void) deleteCharactersInRange: (NSRange) range;

    可以将deleteCharactersInRange:和rangeOfString:连接在一起。

    NSMutableString是NSString的子类,可以在NSMutableString中使用所有NSString的方法

    任何使用NSString的地方都可以使用NSMutableString代替,任何接受NSString的方法也都会接受NSMutableString。

    NSString中的类方法stringWithFormat也可以在NSMutableString中使用

    5、集合家族

    Cocoa提供了许多集合类,如NSArray和NSDictionary,它们的实例就是为了存储其他对象而存在的。

    NSArray

    NSArray是一个Cocoa类,用来存储对象的有序列表,可以在NSArray中存放任意类型的对象。

    只要有了一个NSArray,就可以通过各种方式来操作它,例如让某个对象的实例变量指向这个数组,将该数组当做参数传递给方法或函数,获取数组中所存放对象的个数,提取某个索引所对应的对象,查找数组中的对象,遍历数组,以及其它许多操作。

    NSArray有两个限制,首先,它只能存储Objective-C对象,而不能存储C语言的基本数据类型。同时不能在NSArray中存储nil(对象的零值或NULL值)。有很多方法可以避开这些限制。

    可以通过类方法arrayWithObjects: 创建一个新的NSArray。发送一个以逗号分隔的对象列表,在列表结尾添加nil代表列表结束(这也是不能在数组中存储nil的原因)。

    NSArray *array;

    array=[NSArray arrayWithObjects: @"one", @"two", @"three", nil];

    通过数组的count方法获得它所包含的对象个数:

    - (unsigned) count;

    并且可以通过objectAtIndex: 获取特定索引处的对象:

    - (id) objectAtIndex: (unsigned int) index;

    如果索引大于数组中对象的个数,那么Cocoa在运行时会输出错误。

    NSArray创建的是不可变对象的数组。一旦用特定数量的对象创建了一个数组,那么它就固定下来了;既不能添加元素也不能删除元素,不过数组中包含的对象是可改变的,但数组对象本身是不可变的。

    NSMutableArray可变数组,可以随意添加和删除数组中的对象。NSMutableArray通过类方法arrayWithCapacity来创建新的可变数组。

    + (id) arrayWithCapacity: (unsigned) numItems;

    数组容量是一个参考值。

    使用addObject: 在可变数组末尾添加对象:

    - (void) addObject: (id) anObject;

    可以用removeObjectAtIndex: 来删除某个对象:

    - (void) removeObjectAtIndex: (unsigned) index;

    6、枚举

    NSEnumerator,是Cocoa用来描述这种集合迭代运算的方式。

    要想使用NSEnumerator,需通过objectEnumerator向数组请求枚举器

    -  (NSEnumerator  *) objectEnumerator;

    例如:编写一个从0到[array count]的循环来读取每个索引处的对象。

    NSEnumerator *enumerator;

    enumerator=[array objectEnumerator];

    如果想要从后向前浏览集合,还有一个方法reverseObjectEnumerator可以使用。

    在获得枚举器之后,可以开始一个while循环,每次循环都向这个枚举器请求它的nextObject下一个对象:

    -  (id) nextObject;

    nextObject返回nil时循环结束。

    id thing;

    while(thing = [enumerator nextObject]){  //将数组中的某对象赋给thing变量

      ....

    }

    对可变数组进行枚举操作时,有一点需要注意:不能通过添加或删除对象这类方式来改变数组容器。可能会导致未定义结果。

    快速枚举(类似C++中的for(auto i:arr)这样的)

    for(NSString *string in array){

      NSLog...

    }

    7、NSDictionary

    字典。NSDictionary在给定的关键字(通常是一个NSString字符串)下存储一个数值(可以是任意类型的对象)。然后就可以用这个关键字来查找相应的数值。

    NSDictionary是不可变对象,NSMutableDictionary类允许随意添加和删除字典元素。

    在创建新的NSDictionary时,就要提供该字典所存储的全部对象和关键字。

    使用类方法dictionaryWithObjectsAndKeys: 来创建字典。

    + (id) dictionaryWithObjectsAndKeys: (id) firstObject, ...;

    该方法接收对象和关键字交替存储的系列,以nil值作为终止符号

    NSDictionary *tires;

    tires=[NSDictionary dictionaryWithObjectsAndKeys: t1,@"front left",t2,@"front right",...nil];

    t1和t2是对象,它们之后的字符串是对象的键。

    使用方法objectForKey: 来获取字典中的值,向方法传递之前用来存储该值的关键字。

    - (id) objectForKey: (id) akey;

    Tire *tire=[tires objectForKey:@"front left"];

    如果字典中不存在该键,则objectForKey会返回nil。

    要创建新的NSMutableDictionary对象,向类NSMutableDictionary发送dictionary消息。可以使用dictionaryWithCapacity: 方法来创建新的可变字典并且告诉Cocoa该字典的最终大小。

    + (id) dictionaryWithCapacity: (unsigned int) numItems;

    这里的容量也是一个建议值。

    可以使用setObject:forKey: 方法给字典添加元素:

    - (void) setObject: (id) anObject forKey: (id) aKey;

    NSMutableDictionary *tires;

    tires=[NSMutableDictionary dictionary];

    [tires setObject: t1 forKey: @"front-left"];

    如果对字典中已有的关键字使用setObject: forKey: ,那么这个方法将会用新值替换原有数值。

    如果想在可变字典中删除一个关键字,可以使用removeObjectForKey: 方法。

    - (void) removeObjectForKey: (id) aKey;

    8、NSNumber

    NSNumber类包装基本数据类型,可以用下列类方法创建新的NSNumber对象:

    + (NSNumber *) numberWithChar: (char) value;

    + (NSNumber *) numberWithInt: (int) value;

    + (NSNumber *) numberWithFloat: (float) value;

    + (NSNumber *) numberWithBool: (BOOL) value;

    还有许多种创建方法,无符号版本和种种long与long long型数据。

    只要将一个基本类型数据封装到NSNumber中后,就可以通过下面的实例方法重新获得它:

    - (char) charValue;

    - (int) intValue;

    - (float) floatValue;

    - (BOOL) boolValue;

    - (NSString *) stringValue;

    将创建方法和提取方法配对使用是完全可以的,用numberWithFloat: 创建的NSNumber可以用intValue来提取数值,NSNumber会对数据进行适当的转换。

    9、NSValue

    NSNumber实际上是NSValue的子类,NSValue可以包装任意值。可以用NSValue将结构放入NSArray和NSDictionary中。

    可以使用类方法创建新的NSValue:

    + (NSValue *) valueWithBytes: (const void *) value objCType: (const char *) type;

    传递的参数是你想要包装的数值的地址。得到的是你想要存储的变量的地址。

     可以提供一个用来描述这个数据类型的字符串,通常用来说明struct中实体的类型和大小。不用自己写代码来生成这个字符串,@encode编译器指令可以接受数据类型的名称并为你生成合适的字符串

    NSRect rect=NSMakeRect(1,2,30,40);

    NSValue *value;

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

    可以使用方法getValue: 来提取数值:

    - (void) getValue: (void *) value;

    调用getValue: 时,要传递的是要存储这个数值的变量的地址:

    value=[array objectAtIndex: 0];

    [value getValue: &rect];

    Cocoa提供了将常用的struct型数据转换成NSValue的便捷方法,如下所示:

    + (NSValue *) valueWithPoint: (NSPoint) point;

    + (NSValue *) valueWithSize: (NSSize) size;

    + (NSValue *) valueWithRect: (NSRect) rect;

    - (NSPoint) pointValue;

    - (NSSize) sizeValue;

    - (NSRect) rectValue;

    可按下面的方式在NSArray中存储和检索NSRect:

    value=[NSValue valueWithRect: rect];

    [array addObject: value];

    NSRect anotherRect=[value rectValue];

    10、NSNull

    前面提到,不能在集合中放入nil值,因为在NSArray和NSDictionary中nil有特殊含义。

    但有时确实需要存储一个表示“这里什么都没有”的值。

    NSNull大概是Cocoa中最简单的类了,它只有一个方法:

    + (NSNull *) null;

    可以按照下面的方式将它添加到集合中:

    [contact setObject: [NSNull null] forKey: @"home fax machine"];

    访问它的方法如下:

    id homefax;

    homefax=[contact objectForKey: @"home fax machine"];

    if(homefax==[NSNull null]){

      //...

    }

    [NSNull null]总是返回一样的数值,所以可以使用运算符==将该值与其它值进行比较。

  • 相关阅读:
    用到的一些方法
    Android屏蔽Home键
    Android自定义GridView显示一行,并且可以左右滑动
    模糊匹配字母大小写
    Android四大组件之Content Provider的学习
    用于小数据存储的SharedPreferences
    Android小知识点
    【译】用C/C++操作链表
    和好友的QQ记录,多关注哈需要关怀的人
    岁不待人_20080321
  • 原文地址:https://www.cnblogs.com/cjj-ggboy/p/12969425.html
Copyright © 2011-2022 走看看