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);

NSPoint\CGPoint

在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)

NSPoint\CGPoint

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);

NSSize\CGSize

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

typedef CGSize NSSize;

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

struct CGSize {

CGFloat width;

CGFloat height;

};

typedef struct CGSize CGSize;

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

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

NSRect\CGRect

在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(@"\n文件读取失败,错误信息如下:\n%@",
desc);

}
else { // 文件读取成功

NSLog(@"\n文件读取成功,内容如下:\n%@",
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(@“\n读取失败,错误信息如下:\n%@",
desc);

}
else { // 读取成功

NSLog(@“\n读取成功,内容如下:\n%@",
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路径允许用字段名称来get\set对象字段.访问子孙对象的字段,需要使用”.”这个分隔符

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操作(这个原则还适用于其他集合:NSDictionary\NSSet等)

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常用数据类型大全解的更多相关文章

  1. SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

  2. SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

  3. redis详解(二)-- 数据类型详解

    Redis常用数据类型详解 1,Redis最为常用的数据类型主要有以下: String Hash List Set Sorted set pub/sub Transactions 在具体描述这几种数据 ...

  4. VC++常用数据类型及其操作详解

    原文地址:http://blog.csdn.net/ithomer/article/details/5019367 VC++常用数据类型及其操作详解 一.VC常用数据类型列表 二.常用数据类型转化 2 ...

  5. db2常用命令大全

    #显示这个DB2错误的解释信息(SQLSTATE 5位数字)db2 ? 42704 #显示这个SQLCODE的解释信息(SQLCODE 四位数字) db2 ? SQL0204N ##查看数据库指定配置 ...

  6. NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...

  7. 【转】NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...

  8. oracle 数据类型详解---日期型(转载)

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...

  9. linux 常用命令大全

    linux 常用命令大全 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统 ...

随机推荐

  1. onWindowFocusChanged-屏幕焦点函数回调情况

    1.这个函数的具体作用不太清楚,但网上有人说是 ,当activity得到或者失去焦点的时候,就会调用这个方法 先看如下代码 @Override public void onWindowFocusCha ...

  2. Android时间对话框TimePickerDialog介绍

    目前网上流行着很多对“时间对话框TimePickerDialog”的讲解文章,但感觉都不是很详细.这里详细对该方面的知识进行介绍,旨在帮助初学者能够快速掌握该项技术. 首先要做的是声明一个日历类的对象 ...

  3. Vue 执行npm run dev时报了三个warning的原因

    刚装上了win10,用vue运行下项目,输入npm run dev之后报了三个以下错误: There are multiple modules with names that only differ ...

  4. 洛谷 P3131 [USACO16JAN]子共七Subsequences Summing to Sevens

    P3131 [USACO16JAN]子共七Subsequences Summing to Sevens 题目描述 Farmer John's NN cows are standing in a row ...

  5. RMAN-03002、RMAN-06059

    使用RMAN备份的时候无法正常备份,抛出以下错误: RMAN-03002: failure of backup command at 04/20/2015 18:55:45 RMAN-06059: e ...

  6. Spring Boot 热部署(转)

    Spring Boot 热部署 实际开发中,修改某个页面数据或逻辑功能都需要重启应用.这无形中降低了开发效率,所以使用热部署是十分必要的. 什么是热部署? 应用启动后会把编译好的Class文件加载的虚 ...

  7. [Angular2 Router] Configure Auxiliary Routes in the Angular 2 Router - What is the Difference Towards a Primary Route?

    In this tutorial we are going to learn how we can can configure redirects in the angular 2 router co ...

  8. pat 2-05. 求集合数据的均方差(水题)

    代码: #include<cstdio> #include<iostream> #include<cmath> using namespace std; doubl ...

  9. 嵌入式Linux学习笔记 NAND Flash控制器

    一.NAND Flash介绍和NAND Flash控制器的使用 NAND Flash在嵌入式系统中的作用,相当于PC上的硬盘 常见的Flash有NOR Flash和NAND Flash,NOR Fla ...

  10. 9.6 Binder系统_驱动情景分析_server的多线程实现

    当多个client对server发出请求的时候,如果server忙不过来的时候会创建多线程来处理请求 那么忙不过来由谁来判断? server进程有个binder_proc结构体,其里面有todo链表( ...