OC常用数据类型大全解

摘要:
UI基础OC常用数据类型BlockBlock封装了一段代码,可以在任何时候执行Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline的,并且默认情况下它对局部变量是只读的苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多Blocks的定义Blocks的定义:int=^{returna+b;};定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。

UI基础
OC常用数据类型

Block

Block封装了一段代码,可以在任何时候执行

Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline(内联函数)的,并且默认情况下它对局部变量是只读的

苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多

Blocks的定义

Blocks的定义:

int (^MySum)(int, int) = ^(int a, int b) {

return a+b;

};

定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现

Block可以访问局部变量,但是不能修改。

int sum = 10;

int (^MyBlock)(int) = ^(int num) {

sum++;//编译报错

return num * sum;

};

如果要修改就要加关键字:__block

__block int sum = 10;

Blocks和函数指针对比

n定义函数指针

int (*myFn)();

n定义Blocks

int (^MyBlocks)(int,int);

n调用函数指针

(*myFn)(10, 20);

n调用Blocks

MyBlocks(10, 20);

Blocks的赋值

在声明的同时定义变量,然后赋值

int (^MySum)(int,int) = ^(int a,int b) {

return a + b;

};

也可先用typedef先声明类型,再定义变量进行赋值

typedef int (^MySum)(int,int);

MySum sum = ^(int a,int b) {

return a + b;

};

Foundation框架

正如其名,Foundation框架是其他所有iOS框架的基础

Foundation框架包含了很多开发中常用的数据类型:

u结构体
u枚举
u类
u
l要想使用Foundation中的数据类型,包含它的主文件即可

#import <Foundation/Foundation.h>

NSRange

在Foundation/NSRange.h中对NSRange的定义

typedef struct _NSRange {

NSUInteger location;

NSUInteger length;

} NSRange;

// typedef unsigned long NSUInteger;

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

location表示该范围的起始位置

length表示该范围内所含的元素个数

比如”I love objective-c”中的”obj”可以用location为7,length为3的范围来表示

NSRange

有3种方式创建一个NSRange变量

第1种:直接给成员赋值

NSRange range;

range.location = 7;

range.length = 3;

第2种:应用C语言的聚合结构赋值机制

NSRange range = {7, 3};

或者 NSRange range = {.location = 7,.length = 3};

第3种:Foundation框架提供的一个快捷函数NSMakeRange

NSRange range = NSMakeRange(7,3);

NSPointCGPoint

在Foundation/NSGeometry.h中对NSPoint的定义

typedef CGPoint NSPoint;

在CoreGraphics/CGGeometry.h中对CGPoint的相关定义

struct CGPoint {

CGFloat x;

CGFloat y;

};

typedef struct CGPoint CGPoint;

// #define CGFLOAT_TYPE double

// typedef CGFLOAT_TYPE CGFloat;

NSPoint和CGPoint是等价的

这个结构体代表的是平面中的一个点(x, y)

NSPointCGPoint

Foundation框架提供了一个NSMakePoint()创建NSPoint

NSPoint point = NSMakePoint(10, 20);

或者

CGPoint point = NSMakePoint(10, 20);

在CoreGraphics框架中也提供了CGPointMake()创建一个NSPoint(CGPoint)

NSPoint point = CGPointMake(10, 20);

或者

CGPoint point = CGPointMake(10, 20);

NSSizeCGSize

在Foundation/NSGeometry.h中对NSSize的定义

typedef CGSize NSSize;

在CoreGraphics/CGGeometry.h中对CGSize的相关定义

struct CGSize {

CGFloat width;

CGFloat height;

};

typedef struct CGSize CGSize;

这个结构体用来存储宽度和高度

可以利用NSMakeSize()和CGSizeMake()创建CGSize

NSRectCGRect

在Foundation/NSGeometry.h中对NSRect的定义

typedef CGRect NSRect;

在CoreGraphics/CGGeometry.h中对CGRect的相关定义

struct CGRect {

CGPoint origin; // 矩形左上角坐标

CGSize size; // 矩形的宽度和高度

};

typedef struct CGRect CGRect;

这个结构体用来存储位置和宽高

可以利用NSMakeRect()和CGRectMake()创建CGRect

NSString的创建

创建常量字符串

NSString *string = @"This is a String!";

通过字符串创建字符串

[[NSString alloc] initWithString:@"This is a String!"];

// 或者[[NSString alloc] initWithFormat:@"My age is %i", 17];

用标准c创建字符串

char *cString = "这是一串中文";

[[NSString alloc] initWithCString:cString encoding:NSUTF8StringEncoding];

或者 [[NSString alloc] initWithUTF8String:cString];

// 字符串编码可以在NSString.h中查阅

NSString的创建

从文件中读取字符串

NSError *error = nil; // 用来记录错误信息

NSString *path = @"/Users/apple/Desktop/test.txt"; // 文件路径

NSString *string = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];

if (error) { // 文件读取失败

// 得到"通俗易懂"的错误信息

NSString *desc = [error localizedDescription];

NSLog(@" 文件读取失败,错误信息如下: %@", desc);

} else { // 文件读取成功

NSLog(@" 文件读取成功,内容如下: %@", string);

}

// 将中文字符编码转为NSStringEncoding格式的编码

// NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(

kCFStringEncodingGB_18030_2000);

NSString的创建

从一个Url读取字符串

NSError *error = nil; // 用来记录错误信息

NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];

NSString *string = [[NSString alloc] initWithContentsOfURL:url

encoding:NSUTF8StringEncoding error:nil];

if (error) { // 读取失败

// 得到"通俗易懂"的错误信息

NSString *desc = [error localizedDescription];

NSLog(@“ 读取失败,错误信息如下: %@", desc);

} else { // 读取成功

NSLog(@“ 读取成功,内容如下: %@", string);

}

NSString的创建

还有一些静态方法(都是autorelease的)

[NSString stringWithUTF8String:"12345"];

[NSString stringWithFormat:@"My age is %i", 27];

[NSString stringWithCString:"12345" encoding:NSUTF8StringEncoding];

NSString *path = @"/Users/apple/Desktop/test.txt”;

[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];

NSString *string = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

NSString的导出

将字符串写入文件

NSString *string = @"我是字符串";

NSString *path = @"/Users/apple/Desktop/abc.txt";

[string writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];

或者

NSString *urlPath = @"file:///Users/apple/Desktop/abc.txt";

NSURL *url = [NSURL URLWithString:urlPath];

[string writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];

NSString大小写处理

- (NSString *)uppercaseString

全部转为大写字母

- (NSString *)lowercaseString

全部转为小写字母

- (NSString *)capitalizedString

首字母变大写,其他字母都变小写

NSString的比较

- (BOOL)isEqualToString:(NSString *)aString

比较两个字符串的内容是否相同,相同就返回YES,不同则返回NO

- (NSComparisonResult)compare:(NSString *)string

逐个字符地进行比较,返回NSComparisonResult来显示比较结果.

NSComparisonResult是一个枚举,有3个值:

NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending

如果左侧大于右侧,返回NSOrderedDescending,

如果左侧小于右侧,返回NSOrderedAscending,

否则返回NSOrderedSame

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string

忽略大小写进行比较,返回值与compare:一致

NSString中搜索字符串

- (BOOL)hasPrefix:(NSString *)aString

是否以aString开头

- (BOOL)hasSuffix:(NSString *)aString

是否以aString结尾

- (NSRange)rangeOfString:(NSString *)aString

检查是否包含了aString,如果包含,就返回aString的位置,如果不包含,NSRange的location为-1,length为0

- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask

可以传递一个mask参数,改变搜索方式

比如NSStringCompareOptions为NSBackwardsSearch表示从尾部开始搜索

- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)searchRange

还可以用searchRange指定搜索范围

NSString的截取

- (NSString *)substringFromIndex:(NSUInteger)from

从指定位置from开始(包括指定位置的字符)到尾部

- (NSString *)substringToIndex:(NSUInteger)to

从字符串的开头一直截取到指定的位置to,但不包括该位置的字符

- (NSString *)substringWithRange:(NSRange)range

按照所给出的NSRange从字符串中截取子串

- (NSArray *)componentsSeparatedByString:(NSString *)separator

用separator为分隔符截取子串,返回一个装着所有子串的集合NSArray

NSString与路径

+ (NSString *)pathWithComponents:(NSArray *)components

将components中的字符串按顺序拼成一个路径

- (NSArray *)pathComponents

将一个路径分解成一个装着每一个目录的NSArray

- (BOOL)isAbsolutePath

是否为绝对路径

- (NSString *)lastPathComponent

获得最后一个目录

- (NSString *)stringByDeletingLastPathComponent

删除最后一个目录

- (NSString *)stringByAppendingPathComponent:(NSString *)str

在路径的后面拼接一个目录

NSString与拓展名

- (NSString *)pathExtension

获得拓展名

- (NSString *)stringByDeletingPathExtension

删除尾部的拓展名

- (NSString *)stringByAppendingPathExtension:(NSString *)str

在尾部添加一个拓展名

NSString其他用法

- (NSUInteger)length

返回字符串的长度(字符个数)

- (unichar)characterAtIndex:(NSUInteger)index

返回index位置对应的字符

- (double)doubleValue

- (float)floatValue

- (int)intValue

- (char *)UTF8String

转为C语言中的字符串

NSMutableString

NSString是不可变的,不能删除字符或者添加字符。NSString有一个子类NSMutableString,称为”可变字符串”

创建可变字符串的常用方法

u- (id)initWithCapacity:(NSUInteger)capacity
u+ (id)stringWithCapacity:(NSUInteger)capacity

capacity只是一个最优值,字符串的大小并不仅限于所提供的容量,设置了capacity,可以预分配一块内存来存储它,操作速度会快很多

当然,也可以使用创建NSString的方法来创建NSMutableString,因为NSMutableString是NSString的子类,NSString能用的方法,NSMutableString都能使用

NSMutableString常用处理

- (void)setString:(NSString *)aString

初始化完毕后可以使用此方法设置字符串的内容

- (void)appendString:(NSString *)aString

- (void)appendFormat:(NSString *)format, ...

这两个方法都是在尾部拼接一段字符串

- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString

将range位置的字符串替换为aString

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc

在loc这个位置插入aString(aString的起始位置是就loc)

- (void)deleteCharactersInRange:(NSRange)range

删除range这个范围的字符串(经常跟rangeOfString:一起使用删除特定的字符串)

NSArray

用来存储对象的有序列表,它是不可变的

不能直接存储C语言中的基本数据类型,如int、float、enum、struct,也不能存储nil

创建NSArray的常用方法

+ (id)array

+ (id)arrayWithObject:(id)anObject

+ (id)arrayWithObjects:(id)firstObj, ...

+ (id)arrayWithArray:(NSArray *)array

- (id)initWithObjects:(id)firstObj, ...

- (id)initWithArray:(NSArray *)array

+ (id)arrayWithContentsOfFile:(NSString *)path

+ (id)arrayWithContentsOfURL:(NSURL *)url

- (id)initWithContentsOfFile:(NSString *)path

- (id)initWithContentsOfURL:(NSURL *)url

NSArray查询

- (NSUInteger)count

获取集合元素个数

- (BOOL)containsObject:(id)anObject

是否包含某一个元素

- (id)lastObject

返回最后一个元素

- (id)objectAtIndex:(NSUInteger)index

获得index位置对象的元素

- (NSUInteger)indexOfObject:(id)anObject

查找元素的位置

- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range

在range范围内查找元素的位置

NSArray比较

- (BOOL)isEqualToArray:(NSArray *)otherArray

比较两个集合内容是否相同

- (id)firstObjectCommonWithArray:(NSArray *)otherArray

返回两个集合中第一个相同的对象元素

NSArray给元素发送消息

- (void)makeObjectsPerformSelector:(SEL)aSelector

- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument

让集合里面的所有元素都执行aSelector这个方法

NSArray遍历

普通遍历

NSUInteger count = [array count];

for (int i = 0; i < count; i++) {

id obj = [array objectAtIndex:i];

}

快速遍历

for (id obj in array)

迭代器遍历(查看NSEnumerator的用法)

block遍历

[array enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop) {

NSLog(@"%@ - %zi", object, index);

}]

NSEnumerator

集合的迭代器,可用于遍历集合元素

NSArray有相应的方法来可以获取迭代器

u- (NSEnumerator *)objectEnumerator

获取一个正序遍历的迭代器

u- (NSEnumerator *)reverseObjectEnumerator

获取一个反序遍历的迭代器

NSEnumerator常用方法

u- (id)nextObject

获取下一个元素

u- (NSArray *)allObjects

获取没有被遍历过的元素

NSArray派生出新的集合

- (NSArray *)arrayByAddingObject:(id)anObject

添加一个元素,返回一个新的NSArray(方法调用者本身没有改变)

- (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray

添加otherArray的所有元素,返回一个新的NSArray(方法调用者本身没有改变)

- (NSArray *)subarrayWithRange:(NSRange)range

截取range范围的数组元素

NSArray其他方法

- (NSString *)componentsJoinedByString:(NSString *)separator

用separator作拼接符将数组元素拼接成一个字符串

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile

将一个NSArray持久化到文件中去

NSArray排序

- (NSArray *)sortedArrayUsingSelector:(SEL)comparator

例如这样调用(假设array里面装着Student对象):

[array sortedArrayUsingSelector:@selector(compare:)]

那么Student必须实现compare:这个方法,按照Student的_name属性来排序

- (NSComparisonResult)compare:(Student *)stu {

return [_name compare:stu.name];

}

- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr

//typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);

[array sortedArrayUsingComparator:^(Student *s1, Student *s2) {

return [s1.name compare:s2.name];

}]; // 按照name排序

NSArray排序

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors

-单字段比较进行排序是比较简单,如果按照Student.book.name、Student.name、Student.ID这样的优先级进行排序,可以想象到它的复杂性.
-这个方法接收一组NSSortDescriptor对象作为参数.每个NSSortDescriptor对象指定一个key路径和排序方向(升序或者降序).数组中NSSortDescriptors的顺序决定每个字段的优先级. key路径允许用字段名称来getset对象字段.访问子孙对象的字段,需要使用”.”这个分隔符

NSArray排序

NSSortDecriptor的初始化方法

u+ (id)sortDescriptorWithKey:(NSString *)key ascending:(BOOL)ascending

默认是用compare:作为比较方法

u+ (id)sortDescriptorWithKey:(NSString *)key ascending:(BOOL)ascending selector:(SEL)selector

可以传递一个selector设置比较方法

u+ (id)sortDescriptorWithKey:(NSString *)key ascending:(BOOL)ascending comparator:(NSComparator)cmptr

可以传递一个block来专门比较

NSArray的内存管理

每当有一个对象添加到NSArray中,都会对这个对象做一次retain操作

当NSArray被销毁时,会对内部存放的所有对象都做一次release操作

NSMutableArray

可变的NSArray,NSArray的子类,可以随意的添加或者删除元素

创建NSMutableArray的方法:

u+ (id)arrayWithCapacity:(NSUInteger)numItems
u- (id)initWithCapacity:(NSUInteger)numItems

也可以使用创建NSArray的方法来创建NSMutableArray

当一个元素被加到集合中时,会执行一次retain操作;当一个元素从集合中移除时,会执行一次release操作;当集合被销毁时(调用了dealloc),集合里的所有元素都会执行一次release操作(这个原则还适用于其他集合:NSDictionaryNSSet等)

NSMutableArray添加元素

- (void)setArray:(NSArray *)otherArray

设置集合元素

- (void)addObject:(id)anObject

添加一个元素

- (void)addObjectsFromArray:(NSArray *)otherArray

添加otherArray的全部元素到集合中

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index

在index位置插入一个元素

- (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes

在indexes指定的位置分别插入objects中的元素

NSMutableArray删除元素

- (void)removeLastObject

删除最后一个元素

- (void)removeAllObjects

删除所有的元素

- (void)removeObjectAtIndex:(NSUInteger)index

删除index位置的元素

- (void)removeObjectsAtIndexes:(NSIndexSet *)indexes

删除indexes位置的所有元素

- (void)removeObject:(id)anObject

删除特定的元素

- (void)removeObject:(id)anObject inRange:(NSRange)range

在range范围内查找特定的元素进行删除

- (void)removeObjectsInArray:(NSArray *)otherArray

删除同时存在于otherArray和当前集合中的所有元素

- (void)removeObjectsInRange:(NSRange)range

删除range范围内的所有元素

NSMutableArray替换元素

- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject

用anObject替换index位置对应的元素

- (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray *)objects

用objects中的元素分别替换indexes对应位置的元素

- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray range:(NSRange)otherRange

用otherArray中otherRange范围内的元素替换当前集合range范围内的元素

- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray

用otherArray中的元素替换当前集合range范围内的元素

- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2

交换idx1和idx2位置的元素

NSMutableArray排序

- (void)sortUsingDescriptors:(NSArray *)sortDescriptors

- (void)sortUsingComparator:(NSComparator)cmptr

- (void)sortUsingSelector:(SEL)comparator

用法参考NSArray的排序

NSMutableArray的内存管理

每当有一个元素添加到NSMutableArray中,都会对这个元素做一次retain操作

每当有一个对象从NSMutableArray中移除中,都会对这个元素做一次release操作

当NSMutableArray被销毁时,会对内部存放的所有元素做一次release操作

NSDictionary

通过唯一的key找到对应的value,类似于Java的Map

常见的创建NSDictionary的方法

+ (id)dictionary

+ (id)dictionaryWithObject:(id)object forKey:(id <NSCopying>)key

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

+ (id)dictionaryWithDictionary:(NSDictionary *)dict

+ (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys

- (id)initWithObjectsAndKeys:(id)firstObject, ...

- (id)initWithDictionary:(NSDictionary *)otherDictionary

- (id)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys

+ (id)dictionaryWithContentsOfFile:(NSString *)path

+ (id)dictionaryWithContentsOfURL:(NSURL *)url

- (id)initWithContentsOfFile:(NSString *)path

- (id)initWithContentsOfURL:(NSURL *)url

NSDictionary常用方法

- (NSUInteger)count

返回字典的key数

- (BOOL)isEqualToDictionary:(NSDictionary *)otherDictionary

比较两个字典

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile

将一个NSDicionary持久化到文件中去

NSDictionary访问key和value

- (NSArray *)allKeys

返回所有的key

- (NSArray *)allKeysForObject:(id)anObject

返回anObject元素对应的所有key

- (NSArray *)allValues

返回所有的value

- (id)objectForKey:(id)aKey

根据aKey返回对应的value

- (NSArray *)objectsForKeys:(NSArray *)keys notFoundMarker:(id)marker

返回keys对应的所有value,如果没有对应的value,用marker代替

NSDictionry遍历

快速遍历:for (NSString *key in dict)

迭代器遍历:

u- (NSEnumerator *)keyEnumerator

key的迭代器

u- (NSEnumerator *)objectEnumerator

value的迭代器

block遍历

[dict enumerateKeysAndObjectsUsingBlock:^(id key,

id object, BOOL* stop) {

NSLog(@"key=%@, object=%@", key, object);

}];

NSDictionary的key排序

- (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr

- (NSArray *)keysSortedByValueWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr

- (NSArray *)keysSortedByValueUsingSelector:(SEL)comparator

用法参展NSArray的排序

NSMutableDictionary

可变的NSDictionary,NSDictionary的子类

初始化方法:

u+ (id)dictionaryWithCapacity:(NSUInteger)numItems
u- (id)initWithCapacity:(NSUInteger)numItems
u也可以用初始化NSDictionary的方法来初始化NSMutableDictionary

NSMutableDictionary添加元素

- (void)setDictionary:(NSDictionary *)otherDictionary

设置当前集合的元素

- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey

添加一个键值对

- (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary

添加otherDictionary的所有元素到当前集合中

NSMutableDictionary删除元素

- (void)removeAllObjects

删除所有元素

- (void)removeObjectForKey:(id)aKey

删除aKey对应的值

- (void)removeObjectsForKeys:(NSArray *)keyArray

删除keyArray中所有key对应的值

NSNumber

NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray、NSDictionary等集合中

常见的初始化方法:

+ (NSNumber *)numberWithChar:(char)value

+ (NSNumber *)numberWithInt:(int)value

+ (NSNumber *)numberWithFloat:(float)value

+ (NSNumber *)numberWithBool:(BOOL)value

- (id)initWithChar:(char)value

- (id)initWithInt:(int)value

- (id)initWithFloat:(float)value

- (id)initWithBool:(BOOL)value

NSNumber常用方法

- (char)charValue

- (int)intValue

- (double)doubleValue

- (BOOL)boolValue

- (NSString *)stringValue

- (NSComparisonResult)compare:(NSNumber *)otherNumber

- (BOOL)isEqualToNumber:(NSNumber *)number

NSValue

NSNumber是NSValue的子类,但NSNumber只能包装数字类型,NSValue可以包装任意值.也就可以用NSValue包装结构体后加入NSArray、NSDictionary等集合中

创建NSValue的常用方法

u- (id)initWithBytes:(const void *)value objCType:(const char *)type
u+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type
u+ (NSValue *)value:(const void *)value withObjCType:(const char *)type

value参数是想要包装的数据的地址(如一个NSPoint的地址,可以用&来取地址),type参数是用来描述这个数据类型的字符串,用@encode指令来生成

NSValue常用方法

- (void)getValue:(void *)value

获取所包装的数据, 保存到value这个地址

- (const char *)objCType

返回描述所包装数据类型的字符串

- (BOOL)isEqualToValue:(NSValue *)value

NSValue常用方法

为了方便struct和NSValue的转换,cocoa还提供了以下方法

+ (NSValue *)valueWithPoint:(NSPoint)point

+ (NSValue *)valueWithSize:(NSSize)size

+ (NSValue *)valueWithRect:(NSRect)rect

- (NSPoint)pointValue

- (NSSize)sizeValue

- (NSRect)rectValue

NSNull

集合中是不能存放nil值的,因为nil在集合中有特殊含义,但有时确实需要存储一个表示”什么都没有”的值,那么就可以使用NSNull,它也是NSObject的一个子类

创建和获取NSNull的方法

+ (NSNull *)null

[NSNull null]总是返回一样的值,所以可以用==将该值与其他值进行比较

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

[dict setValue:[NSNull null] forKey:@"work number"];

id value = [dict valueForKey:@"work number"];

if (value == [NSNull null]) {

NSLog(@"work number dosen't exist.");

}

NSDate的静态初始化

+ (id)date

返回当前时间

+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs

返回以当前时间为基准,然后过了secs秒的时间

+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs

返回以2001/01/01 GMT为基准,然后过了secs秒的时间

+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs

返回以1970/01/01 GMT为基准,然后过了secs秒的时间

+ (id)distantFuture

返回很多年以后的未来的某一天

+ (id)distantPast

返回很多年以前的某一天

NSDate的动态初始化

- (id)addTimeInterval:(NSTimeInterval)secs

返回以目前的实例中保存的时间为基准,然后过了secs秒的时间

- (id)init

初始化为当前时间。[NSDate date]

- (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs

初始化为以2001/01/01 GMT为基准,然后过了secs秒的时间

- (id)initWithTimeInterval:(NSTimeInterval)secs sinceDate:(NSDate *)refDate

初始化为以refDate为基准,然后过了secs秒的时间

- (id)initWithTimeIntervalSinceNow:(NSTimeInterval)secs

初始化为以当前时间为基准,然后过了secs秒的时间

NSDate日期比较

- (BOOL)isEqualToDate:(NSDate *)otherDate

与otherDate比较,相同返回YES

- (NSDate *)earlierDate:(NSDate *)anotherDate

与anotherDate比较,返回较早的那个日期

- (NSDate *)laterDate:(NSDate *)anotherDate

与anotherDate比较,返回较晚的那个日期

- (NSComparisonResult)compare:(NSDate *)other

该方法用于排序时调用:

.当实例保存的日期值与anotherDate相同时返回NSOrderedSame

.当实例保存的日期值晚于anotherDate时返回NSOrderedDescending

.当实例保存的日期值早于anotherDate时返回NSOrderedAscending

NSDate取回时间间隔

- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)refDate

以refDate为基准时间,返回实例保存的时间与refDate的时间间隔

- (NSTimeInterval)timeIntervalSinceNow

以当前时间(Now)为基准时间,返回实例保存的时间与当前时间(Now)的时间间隔

- (NSTimeInterval)timeIntervalSince1970

以1970/01/01 GMT为基准时间,返回实例保存的时间与1970/01/01 GMT的时间间隔

- (NSTimeInterval)timeIntervalSinceReferenceDate

以2001/01/01 GMT为基准时间,返回实例保存的时间与2001/01/01 GMT的时间间隔

+ (NSTimeInterval)timeIntervalSinceReferenceDate

以2001/01/01 GMT为基准时间,返回当前时间(Now)与2001/01/01 GMT的时间间隔

NSDate日期格式化

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];

formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

// 将NSString转换为NSDate

NSDate *date = [formatter dateFromString:@"2010-03-24 00:00:00"];

// 将NSDate转换为NSString

NSLog(@"%@", [formatter stringFromDate:date]);

NSObject常用方法

- (BOOL)isKindOfClass:(Class)aClass

判断是否为aClass或者aClass的子类的实例

- (BOOL)isMemberOfClass:(Class)aClass

判断是否为aClass的实例(不包括aClass的子类)

- (BOOL)conformsToProtocol:(Protocol)aProtocol

判断对象是否实现了aProtocol协议

+ (BOOL)instancesRespondToSelector:(SEL)aSelector

判断这个类的对象是否拥有参数提供的方法

- (BOOL)respondsToSelector:(SEL)aSelector

判断对象是否拥有参数提供的方法

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

延迟调用参数提供的方法,方法所需参数用withObject传入

反射

Class的反射

u通过类名的字符串形式实例化对象

Class class = NSClassFromString(@"Student");

Student *stu = [[class alloc] init];

u将类名变成字符串

Class class = [Student class];

NSString *className = NSStringFromClass(class);

SEL的反射

u通过方法的字符串形式实例化方法

SEL selector = NSSelectorFromString(@"setName:");

[stu performSelector:selector withObject:@"Mike"];

u将方法变成字符串

NSStringFromSelector(@selector(setName:));

copy和mutableCopy

一个对象使用copy或mutableCopy方法可以创建对象的副本

copy – 需要先实现NSCoppying协议,创建的是不可变副本(如NSString、NSArray、NSDictionary)

mutableCopy – 需要先实现NSMutableCopying协议,创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)

深复制:内容拷贝,源对象和副本指向的是不同的两个对象。源对象引用计数器不变,副本计数器设置为1

浅复制:指针拷贝,源对象和副本指向的是同一个对象。对象的引用计数器+1,其实相当于做了一次retain操作

只有不可变对象创建不可变副本(copy)才是浅复制,其他都是深复制

常见复制

为自定义类添加复制功能

如果想自定义copy,那么就必须遵守NSCopying,并且实现 copyWithZone:方法

如果想自定义mutableCopy,那么就必须遵守NSMutableCopying,并且实现 mutableCopyWithZone: 方法

以copy为例,建议用[self class]代替直接类名

- (id)copyWithZone:(NSZone *)zone {

id copy = [[[self class] allocWithZone:zone] init];

// 做一些属性的初始化.....

return copy;

}

深拷贝:内容拷贝

浅拷贝:指针拷贝

免责声明:文章转载自《OC常用数据类型大全解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Unity3D中使用委托和事件Android中事件监听示例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JS-OC通信之Cordova简介

Cordova 是一个可以让 JS 与原生代码(包括 Android 的 java,iOS 的 Objective-C 等)互相通信的一个库,并且提供了一系列的插件类,比如 JS 直接操作本地数据库的插件类。 这些插件类都是基于 JS 与 Objective-C 可以互相通信的基础的,这篇文章说说 Cordova 是如何做到 JS 与 Objective-...

iOS开发OC基础:OC数组对象NSArray的常用方法

本文介绍了OC的数组对象的基本方法的使用: 因为OC的数组中存储的为对象类型,所以我们可以新建一个Person类,通过Person生成对象进行操作。 其中Person.h中的代码为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #import @interface Person : NSObject {     NSStri...

iOS开发时间戳与时间,时区的转换,汉字与UTF8,16进制的转换

原文:http://blog.sina.com.cn/s/blog_68661bd80101njdo.html //获取当前系统的时间戳+(long)getTimeSp{    long time;    NSDate *fromdate=[NSDate date];    time=(long)[fromdate timeIntervalSince197...

iOS 几种加密方法

iOS常见的几种加密方法 普通加密方法是讲密码进行加密后保存到用户偏好设置中 钥匙串是以明文形式保存,但是不知道存放的具体位置 1、base64加密 base64 编码是现代密码学的基础 基本原理: 原本是 8个bit 一组表示数据,改为 6个bit一组表示数据,不足的部分补零,每 两个0 用 一个 = 表示 用base64 编码之后,数据长度会变大,增...

iOS 三方库fmdb 的使用

使用fmdb 做本地数据的存储非常方便, 1. github 上搜索fmdb 下载压缩包 导入到工程中 (如果你的mac 有cocoapod 也可以直接通过cocoapod 添加) 2. 以下代码是通过fmdb 多数据库的各种操作,其中有几点需要注意:(1). 程序中 Ceasar 是表名 (2). 修改数据库数据 提前准备字符串时 值 要用单引号括起来...

PHP是怎么运行的

这篇文章,研究一下PHP代码是如何解释和执行以及PHP脚本运行的生命周期。 概述 PHP服务的启动。严格来说,PHP的相关进程是不需要手动启动的,它是随着Apache的启动而运行的。当然,如果有需要重启PHP服务的情况下也是可以手动重启PHP服务的。比如说在有开启opcode的正式环境更新了代码之后,需要重启PHP以重新编译PHP代码。 从宏观上来看,PH...