OC-基础数据类型

字符串与基本数据类型转换 获取字符串的每个字符/字符串和其他数据类型转换
NSMutableString 基本概念/常用方法
NSArray NSArray基本概念/创建方式/注意事项/常用方法简写形式/遍历/排序/文件读写/NSArray 与字符串
NSMutableArray 概念/基本用法/错误用法
十一 NSDictionary 基本概念/创建/遍历/文件操作
十二 NSMutableArray NSMutableDictionary 基本概念/常用方法/简写/NSDictionary和NSArray对比
十三 OC中的结构体 NSPoint和CGPoint/NSSize和CGSize/NSRect和CGRect/常见的结构体使用注意
十四 NSNumber NSNumber基本概念/创建/从NSNumber对象中的到基本类型数据
十五 NSValue NSValue基本概念/常见结构体的包装/任意数据的包装
十六 NSDate NSDate基本概念/格式化日期/日期时间对象

七.字符串与基本数据类型转换

1.
  • - (NSUInteger)length;

    • 返回字符串的长度(有多少个文字)
  • - (unichar)characterAtIndex:(NSUInteger)index;

    • 返回index位置对应的字符
2.字符串和其他数据类型转换
  • 转为基本数据类型
    • - (double)doubleValue;
    • - (float)floatValue;
    • - (int)intValue;
    NSString *str1 = @"110";
    NSString *str2 = @"10";
    int res = str1.intValue + str2.intValue;
    NSLog(@"res = %i", res);

    NSString *str1 = @"110";
    NSString *str2 = @"10.1";
    double res = str1.doubleValue + str2.doubleValue;
    NSLog(@"res = %f", res);
  • 转为C语言中的字符串
    • - (char *)UTF8String;
   NSString *str = @"abc";
    //用常量接收,所以用const
    const char *cStr = [str UTF8String];
    NSLog(@"cStr = %s", cStr);
  • C语言字符串转为OC字符串
    char *cStr = "abc";
    NSString *str = [NSString stringWithUTF8String:cStr];
    NSLog(@"str = %@", str);
  • 注意:
    • 如果不是int.double.float.bool.integer.longlong这些类型就不要乱用

八. NSMutableString

  • 只要带Mutable:可变的

概念

1.NSMutableString 基本概念
  • NSMutableString类继承NSString类,那么NSString提�t�供的方法在NSMutableString中基本都可以使用,NSMutableString好比一个字符串链表,它可以任意的动态在字符串中添加字符串/删除字符串 /指定位置插入字符串,使用它来操作字符串会更加灵活。

  • NSMutableString和NSString的区别

    • NSString是不可变的, 里面的文字内容是不能进行修改的 + NSMutableString是可变的, 里面的文字内容可以随时更改
    • NSMutableString能使用NSString的所有方法
2.字符串中的可变和不可变
  • 不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化
   // 改变了指针的指向, 并没有修改字符串
    NSString *str = @"lnj";
    str = @"lmj";

    // 生成了一个新的字符串, 并没有修改字符串
    NSString *newStr = [str substringFromIndex:1];
    NSLog(@"str = %@", str);
    NSLog(@"newStr = %@", newStr);
  • 可变:指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改
//strM是空的字符串
    NSMutableString *strM = [NSMutableString string];
    NSLog(@"strM = %@", strM);
     // 修改原有字符串, 没有生成新的字符串
    [strM appendString:@"lnj"];
    NSLog(@"strM = %@", strM);
    [strM appendString:@" v587"];
    NSLog(@"strM = %@", strM);
  • 常用的是stringWithFormat

常用方法

  • 这些方法都是没返回值的
1.NSMutableString常用方法
  • - (void)appendString:(NSString *)aString;
    • 拼接aString到最后面
NSMutableString *strM = [NSMutableString string];
NSLog(@"strM = %@", strM);
[strM appendString:@"lnj"];
NSLog(@"strM = %@", strM);
  • - (void)appendFormat:(NSString *)format, ...;
    • 拼接一段格式化字符串到最后面
NSMutableString *strM = [NSMutableString string];
NSLog(@"strM = %@", strM);
[strM appendFormat:@"lnj"];
NSLog(@"strM = %@", strM);
  • - (void)deleteCharactersInRange:(NSRange)range;
    • 删除range范围内的字符串
    • 一般情况下利用rangeOfString和deleteCharactersInRange配合删除指定内容
    NSMutableString *strM = [NSMutableString stringWithString:@"http://www.520it.com"];


    //查找http://的位置
    NSRange range = [strM rangeOfString:@"http://"];
    //删除查找到的http://
    [strM deleteCharactersInRange:range];
    NSLog(@"strM = %@", strM);
  • - (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
    • 在loc这个位置中插入aString
    • insertString:需要插入的字符串
    • atIndex:插入的位置
   NSMutableString *strM = [NSMutableString stringWithString:@"www.520it.com"];
    [strM insertString:@"http://" atIndex:0];
    NSLog(@"strM = %@", strM);
  • - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;
    • 使用aString替换range范围内的字符串
    • OccurrencesOfString:需要替换的字符串
    • withString:用什么替换
    • options:替换时的搜索方式
    • range:搜索的范围
    • 返回值:代表替换的字符串的个数
    NSMutableString *strM = [NSMutableString stringWithString:@"http://www.520it.com/hmj.png"];
    NSRange range = [strM rangeOfString:@"hmj"];
    [strM replaceOccurrencesOfString:@"hmj" withString:@"jjj" options:0 range:range];
    NSLog(@"strM = %@", strM);
2.字符串使用注意事项
  • @”lnj”这种方式创建的字符串始终是NSString,不是NSMutalbeString.所以下面的代码创建的还是NSString,此时使用可变字符串的函数,无法操作字符串。
NSMutalbeString *s1 = @”hmj”;
// 会报错
[strM insertString:@"my name is " atIndex:0];
  • 如果调用NSString的字符串替换方法,不会修改原有的字符串,而是产生一个新的字符串
  • 一般情况下,OC方法要求传入一个参数如果没有*,大部分是枚举,一般情况下如果不想用枚举的值,可以传入0,代表按照系统默认的方式处理

练习

将3个520it拼接在一起,中间用空格隔开

NSString *subStr = @"520it";
 NSMutableString *strM  = [NSMutableString string];
    for (int i = 0; i < 3; ++i) {
        // 1.添加一个520it
        [strM appendString:subStr];
        // 2.添加一个空格
        [strM appendString:@" "];
    }
    [strM deleteCharactersInRange:NSMakeRange(strM.length - 1, 1)];
    NSLog(@"strM = |%@|", strM);
  • 在开发中如果对字符串做频繁操作,不要用不可变字符串

九. NSArray

  • 只能加入对象类型
1.NSArray的基本概念
  • 什么是NSArray?

    • NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组
    • C语言中数组的弊端
      • int array[4] = {10, 89, 27, 76};
      • 只能存放一种类型的数据.(类型必须一致)
      • 不能很方便地动态添加数组元素、不能很方便地动态删除数组元素(长度固定)
  • NSArray的使用注意

    • 只能存放任意OC对象, 并且是有顺序的
    • 不能存储非OC对象,比如int\float\double\char\enum\struct等
    • 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的,不能删除里面的元素,也不能再往里面添加元素
2.NSArray的创建方式
  • + (instancetype)array;
  • + (instancetype)arrayWithObject:(id)anObject;
  • + (instancetype)arrayWithObjects:(id)firstObj, ...;
  • + (instancetype)arrayWithArray:(NSArray *)array;根据数组创建数组

  • + (id)arrayWithContentsOfFile:(NSString *)path;

  • + (id)arrayWithContentsOfURL:(NSURL *)url;
3.NSArray 的使用注意事项
  • NSArray直接使用NSLog()作为字符串输出时是小括号括起来的形式。

  • NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。nil就是0。0也是基本数据类型,不能存放到NSArray中。

    NSArray *arr = [NSArray arrayWithObjects:@"hmj", nil ,@"hyh",@"hxj", nil];
    NSLog(@"%@", arr);
输出结果:
(
    hmj
)
4.NSArray的常用方法
  • - (NSUInteger)count;

    • 获取集合元素个数
  • - (id)objectAtIndex:(NSUInteger)index;

    • 获得index位置的元素
  • - (BOOL)containsObject:(id)anObject;

    • 是否包含某一个元素
      • 包含就返回1
      • 不包含就返回0
  • - (id)lastObject;

    • 返回最后一个元素
  • - (id)firstObject;

    • 返回第一个元素
  • - (NSUInteger)indexOfObject:(id)anObject;

    • 查找anObject元素在数组中的位置(如果找不到,返回-1)
  • - (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;

    • 在range范围内查找anObject元素在数组中的位置
5.NSArray的简写形式
  • 自从2012年开始,Xcode的编译器多了很多自动生成代码的功能,使得OC代码更加精简

  • 数组的创建

+ 之前
[NSArray arrayWithObjects:@"Jack", @"Rose", @"Jim", nil];

+ 现在
@[@"Jack", @"Rose", @"Jim"];
  • 数组元素的访问
+ 之前
[array objectAtIndex:0];

+ 现在
array[0];

NSArray 遍历

1.NSArray的下标遍历
    NSArray *arr = @[p1, p2, p3, p4, p5];
    for (int i = 0; i < arr.count; ++i) {
        Person *p = arr[i];
        [p say];
    }
2.NSArray的快速遍历
  • forin(增强for循环)
  • 逐个取出arr中的元素,将取出的元素赋值给obj
  • 注意
    • obj的类型可以根据数组中元素的类型来写,不一定要写NSObject
    NSArray *arr = @[p1, p2, p3, p4, p5];
   for (Person *p in arr) {
        [p say];
    }
3.NSArray 使用block进行遍历
  • OC数组的迭代器
  • 每取出一次就会调用block都会将当前取出的元素对应索引传递给我们
  • stop用于控制遍历的停止
    • 当*stop = YES时,遍历就会停止
   [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"obj = %@, idx = %lu", obj, idx);
        Person *p = obj;
        [p say];
    }];
  • 如果使用OC数组存储对象,可以钓鱼OC数组的方法让数组中所有的元素都执行指定的方法
  • 注意点
    • 如果数组中保存的不是相同类型的数据,并没有相同的方法,那么会报错
4.NSArray给所有元素发消息
  • 让集合里面的所有元素都执行aSelector这个方法
    • - (void)makeObjectsPerformSelector:(SEL)aSelector;
    • - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
    // 让数组中所有对象执行这个方法
    // 注意: 如果数组中的对象没有这个方法会报错
//    [arr makeObjectsPerformSelector:@selector(say)];
    [arr makeObjectsPerformSelector:@selector(eat:) withObject:@"bread"];

NSArray排序

1.NSArray排序
  • Foundation自带类排序
  • 注意
    • 想要使用哪个compare方法对数组中元素进行排序,那么数组中的元素必须是Foundation框架中的对象,也就是说不能是自定义对象
NSArray *arr = @[@(1), @(9), @(5), @(2)];
NSArray *arr = @[@1, @9, @5, @2];
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
  • 自定义类排序
    •   不能用compare:方法进行排序
    NSArray *arr = @[p1, p2, p3, p4, p5];
    //    默认按照升序排序
    NSArray *newArr = [arr sortedArrayWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
    //  return obj1.age > obj2.age;//升序
        return obj1.age < obj2.age;//降序
    }];
    NSLog(@"%@", newArr);

NSArray和NSString之间的转换

  • 字符串拼接
NSArray *arr = @[@"hmj", @"hyh", @"good"];
NSString *str = [arr componentsJoinedByString:@"*"];
NSLog(@"str = %@", str);
  • 字符串切割
NSArray *arr = @"hmj**hyh**good";
NSString *str = [arr componentsSeparatedByString:@"**"];
NSLog(@"str = %@", str);

NSArray文件读写

1.NSArray数据写入到文件中
  • 数据写入到文件中实质是写入一个XML文件
  • 在iOS开发中一般情况下,会将XML文件的扩展名保存为plist
  • 注意
    • writeToFile只能写入数组中保存的元素都是Foundation框架中的类创建的对象,如果保存的是自定义的对象那么不能写入
    NSArray *arr = @[@"lnj", @"lmj", @"jjj", @"xcq"];
    BOOL flag = [arr writeToFile:@"/Users/MJ-Hee/Desktop/persons.plist" atomically:YES];
    NSLog(@"%i", flag);
2.从文件中读取数据到NSArray中
    NSArray *newArr = [NSArray arrayWithContentsOfFile:@"/Users/MJ-Hee/Desktop/persons.xml"];
    NSLog(@"%@", newArr);

NSArray 与字符串

1.把数组元素链接成字符串
  • - (NSString )componentsJoinedByString:(NSString )separator;
    • 这是NSArray的方法, 用separator作拼接符将数组元素拼接成一个字符串
    NSArray *arr = @[@"lnj", @"lmj", @"jjj", @"xcq"];
    NSString *res = [arr componentsJoinedByString:@"*"];
    NSLog(@"res = %@", res);
输出结果:
lnj*lmj*jjj*xcq
2.字符串分割方法
  • - (NSArray )componentsSeparatedByString:(NSString )separator;
    • 这是NSString的方法,将字符串用separator作为分隔符切割成数组元素
    NSString *str = @"lnj-lmj-jjj-xcq";
    NSArray *arr = [str componentsSeparatedByString:@"-"];
    NSLog(@"%@", arr);

输出结果:
(
    lnj,
    lmj,
    jjj,
    xcq
)

十.NSMutableArray

1.NSMutableArray介绍
  • 什么是NSMutableArray
    • NSMutableArray是NSArray的子类
    • NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
    • NSMutableArray是可变的,随时可以往里面添加\更改\删除元素
2.NSMutableArray基本用法
  • 创建空数组
NSMutableArray *arr = [NSMutableArray array];
  • 创建数组,并且指定长度为5,此时也是空数组
NSMutableArray *arr2 = [[NSMutableArray alloc] initWithCapacity:5];
  • 创建一个数组,包含两个元素
NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"1",@"2", nil];
  • 调用对象方法创建数组
NSMutableArray *arr4 = [[NSMutableArray alloc] initWithObjects:@"1",@"2", nil];
  • - (void)addObject:(id)object;

    • 添加一个元素
  • - (void)addObjectsFromArray:(NSArray *)array;

    • 添加otherArray的全部元素到当前数组中
    • 将指定数组中的元素都取出来,放入调用该方法的数组中,并不是将整个数组作为一个元素添加到调用该方法的数组中
      • addObjects:@[@"str1", @"str2"];将真个数组作为一个元素添加到调用该方法的数组中
  • - (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

    • 在index位置插入一个元素
  • - (void)indexSetWithIndexesInRange:(NSRange *)range;

    • 制定插入位置和插入多少
  • - (void)removeLastObject;

    • 删除最后一个元素
  • - (void)removeAllObjects;

    • 删除所有的元素
  • - (void)removeObjectAtIndex:(NSUInteger)index;

    • 删除index位置的元素
  • - (void)removeObject:(id)object;

    • 删除特定的元素
  • - (void)removeObjectsInRange:(NSRange)range;

    • 删除range范围内的所有元素
  • - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;

    • 用anObject替换index位置对应的元素
    • 可以直接替换:arrM[0] = @"HMJ"
  • - (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;

    • 交换idx1和idx2位置的元素
  • -(void)objectAtIndex:(int)index;
    • 获取元素
    • arrM[index];也可以获取元素
3.NSMutableArray 错误用法
  • 不可以使用@[]创建可变数组
NSMutableArray *array = @[@"hmj", @"hyh", @"hhh"];
// 报错, 本质还是不可变数组
[array addObject:@“Peter”];

十一.NSDictionary

1.NSDictionar基本概念
  • 什么是NSDictionary
    • NSDictionary翻译过来叫做”字典”
    • NSDictionary的作用类似:通过一个key,就能找到对应的value
    • NSDictionary是不可变的,一旦初始化完毕,里面的内容就无法修改
2.NSDictionary的创建
+ \+ (instancetype)dictionary;
+ \+ (instancetype)dictionaryWithObject:(id)object forKey:(id <NSCopying>)key;
+ \+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...;
+ \+ (id)dictionaryWithContentsOfFile:(NSString *)path;
+ \+ (id)dictionaryWithContentsOfURL:(NSURL *)url;
+ \- (void)dictionaryWithObject:(NSString *) forKey:(NSString *);
    * 单个数据
+ \- (void)dictionaryWithObjects:(NSArray *) forKey:(NSA rray *);
    * 多个数据
  • 创建键值对
    • NSDictionary *dict = @{@"name": @"hmj" };
    • NSDictionary *dict = @{@"name": @"hmj", @"age": @"23", @"height"; @"1.69" };
  • NSDictionary创建简写
 + 以前
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"lnj", @"name", @"12345678", @"phone", @"天朝", @"address", nil];
+ 现在
NSDictionary *dict = @{@"name":@"lnj", @"phone":@"12345678", @"address":@"天朝"};
  • NSDictionary获取元素简写
+ 以前
[dict objectForKey:@"name”];

+ 现在
dict[@"name”];
  • 键值对集合的特点
    • 字典存储的时候,必须是"键值对"的方式来存储(同时键不要重复)
    • 键值对中存储的数据是"无序的".
    • 键值对集合可以根据键, 快速获取数据.
3.NSDictionary的遍历
  • - (NSUInteger)count;

    • 返回字典的键值对数目
  • - (id)objectForKey:(id)aKey;

    • 根据key取出value
  • 如果获取字典中key和value的个数,键值对

    • [字典名称 count];得到的是键值对的对数
for (int i = 0, i< dict.count, ++i){
    //获取所有的key
    NSArray *keys = [dict allKeys];
    //取出当前位置对应的key
    NSString *key = keys[i];
    NSString *value = dict[key];
    NSLog(@"key = %@, value = %@", key, value);
}

for (NSString *key in dict){
    NSString *value = dict[key];
    NSLog(@"key = %@, value = %@", key, value);
}


[dict enumrateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
    NSLog(@"key = %@, value = %@", key, obj);
}];
  • 快速遍历
    NSDictionary *dict = @{@"name":@"lnj", @"phone":@"12345678", @"address":@"天朝"};
    for (NSString *key in dict) {
        NSLog(@"key = %@, value = %@", key, dict[key]);
    }
  • Block遍历
[dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
        NSLog(@"key = %@, value = %@", key, obj);
    }];
4.NSDictionary文件操作
  • 将字典写入文件中

    • - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
    • - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
    • 存结果是xml文件格式,但苹果官方推荐为plist后缀。
  • 示例

    NSDictionary *dict = @{@"name":@"lnj", @"phone":@"12345678", @"address":@"天朝"};
    BOOL flag = [dict writeToFile:@"/Users/LNJ/Desktop/dict.plist" atomically:YES];
    NSLog(@"flag = %i", flag);
  • 从文件中读取字典
NSDictionary *newDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/LNJ/Desktop/dict.plist"];
NSLog(@"newDict = %@", newDict);

十二.NSMutableDictionary

1.NSMutableDictionary 基本概念
  • 什么是NSMutableDictionary
    • NSMutableDictionary是NSDictionary的子类
    • NSDictionary是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的,不能删除里面的元素, 也不能再往里面添加元素
    • NSMutableDictionary是可变的,随时可以往里面添加\更改\删除元素
2.NSMutableDictionary的常见操作
  • - (void)setObject:(id)anObject forKey:(id )aKey;

    • 添加一个键值对(会把aKey之前对应的值给替换掉)
  • - (void)removeObjectForKey:(id)aKey;

    • 通过aKey删除对应的value
  • - (void)removeAllObjects;

    • 删除所有的键值对
3.NSMutableDictionary的简写
  • 设置键值对
    • 以前
      [dict setObject:@"Jack" forKey:@"name”];
    • 现在
      dict[@"name"] = @"Jack";
4.NSDictionary和NSArray对比
  • NSArray和NSDictionary的区别

    • NSArray是有序的,NSDictionary是无序的
    • NSArray是通过下标访问元素,NSDictionary是通过key访问元素
  • NSArray的用法

    • 创建
      @[@"Jack", @"Rose"] (返回是不可变数组)
    • 访问
      id d = array[1];
    • 赋值
      array[1] = @"jack";
  • NSDictionary的用法

    • 创建
      @{ @"name" : @"Jack", @"phone" : @"10086" } (返回是不可变字典)
    • 访问
      id d = dict[@"name"];
    • 赋值
      dict[@"name"] = @"jack";
  • 添加

    • 会将传入字典中的所有的键值对取出来添加到dict中
  • 注意

    • 不能通过@{}创建一个可变的字典
    • 简单创建的都是不可变的
    • 如果是不可变数组,那么key不能相同
    • 如果是不可变字典出现了同名的key,那么后面的key对应的值不会被保存
    • 如果是在可变字典中,后面的会覆盖前面的值

十三.OC中的结构体

1.NSPoint和CGPoint
  • CGPoint和NSPoint是同义的
typedef CGPoint NSPoint;

CGPoint的定义
struct CGPoint {
  CGFloat x;
  CGFloat y;
};
typedef struct CGPoint CGPoint;
typedef double CGFloat;
  • CGPoint代表的是二维平面中的一个点
    • 可以使用CGPointMake和NSMakePoint函数创建CGPoint
2.NSSize和CGSize
  • CGSize和NSSize是同义的
typedef CGSize NSSize;

CGSize的定义
struct CGSize {
  CGFloat width;
  CGFloat height;
};
typedef struct CGSize CGSize;
  • CGSize代表的是二维平面中的某个物体的尺寸(宽度和高度)
    • 可以使用CGSizeMake和NSMakeSize函数创建CGSize
3.NSRect和CGRect
  • CGRect和NSRect是同义的
typedef CGRect NSRect;

CGRect的定义
struct CGRect {
  CGPoint origin;
  CGSize size;
};
typedef struct CGRect CGRect;
  • CGRect代表的是二维平面中的某个物体的位置和尺寸
    • 可以使用CGRectMake和NSMakeRect函数创建CGRect
4.常见的结构体使用注意
  • 苹果官方推荐使用CG开头的:
    • CGPoint
    • CGSize
    • CGRect
  • 注意点
    • OC中创建结构体的方法都是以NSMake开头
    • 在开发中使用CG开头的结构体,也就说NS开头的结构体一般不用
    • 对象.成员变量来获取结构体的数据

十四.NSNumber

  • 注意
    • 如果传入的是变量,那么必须在@后面写() ,如果传入的是常量,那么@后面的()可以省略
1.NSNumber基本概念
  • NSArray\NSDictionary中只能存放OC对象,不能存放int\float\double等基本数据类

  • 如果真想把基本数据(比如int)放进数组或字典中,需要先将基本数据类型包装成OC对象

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

2.NSNumber的创建
  • 以前

    • + (NSNumber *)numberWithInt:(int)value;
    • + (NSNumber *)numberWithDouble:(double)value;
    • + (NSNumber *)numberWithBool:(BOOL)value;
  • 现在

    • @10;
    • @10.5;
    • @YES;
    • @(num);
3.从NSNumber对象中的到基本类型数据
  • - (char)charValue;
  • - (int)intValue;
  • - (long)longValue;
  • - (double)doubleValue;
  • - (BOOL)boolValue;
  • - (NSString *)stringValue;
  • - (NSComparisonResult)compare:(NSNumber )otherNumber; - - (BOOL)isEqualToNumber:(NSNumber )number;

十五.NSValue

1.NSValue基本概念
  • NSNumber是NSValue的子类, 但NSNumber只能包装数字类型

  • NSValue可以包装任意值

    • 因此,可以用NSValue将结构体包装后,加入NSArray\NSDictionary中
2. 常见结构体的包装
  • 为了方便结构体和NSValue的转换,Foundation提供了以下方法
  • 将结构体包装成NSValue对象

    • + (NSValue *)valueWithPoint:(NSPoint)point;
    • + (NSValue *)valueWithSize:(NSSize)size;
    • + (NSValue *)valueWithRect:(NSRect)rect;
  • 从NSValue对象取出之前包装的结构体

    • - (NSPoint)pointValue;
    • - (NSSize)sizeValue;
    • - (NSRect)rectValue;
3.任意数据的包装
  • NSValue提供了下列方法来包装任意数据

    • + (NSValue )valueWithBytes:(const void )value objCType:(const char *)type;
    • value参数 : 所包装数据的地址
    • type参数 : 用来描述这个数据类型的字符串, 用@encode指令来生成
  • 从NSValue中取出所包装的数据

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

十六.NSDate

  • 注意
    • 如果是从NSString转换成NSDate,那么dateFormat的格式,必须和字符串中时间格式一致,否则会转换错误
1.NSDate基本概念
  • NSDate可以用来表示时间, 可以进行一些常见的日期\时间处理

  • 一个NSDate对象就代表一个时间

  • [NSDate date]返回的就是当前时间(零时区的时间)

    NSDate *now = [NSDate date];
    NSLog(@"now = %@", now);
     // 设置转换后的目标日期时区
     NSTimeZone *zone = [NSTimeZone systemTimeZone];
     // 得到源日期与世界标准时间的偏移量
     NSInteger interval = [zone secondsFromGMTForDate: date];
     NSLog(@"interval = %lu", interval);
     // 在当前时间基础上追加时区差值
     now = [now dateByAddingTimeInterval:interval];
     NSLog(@"%@", date);
2.格式化日期
  • NSDate -> NSString
    // 1.创建时间
    NSDate *now = [NSDate date];
    // 2.创建时间格式化
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 3.指定格式
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    // 4.格式化时间
    NSString *str = [formatter stringFromDate:now];
    NSLog(@"%@", str);
  • NSString -> NSDate
    NSString *str = @"2015-06-28 19:53:24";
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *date = [formatter dateFromString:str];
    NSLog(@"%@", date);
3.日期时间对象
  • 结合NSCalendar和NSDate能做更多的日期\时间处理
  • 注意

    • 一般情况下,如果一个方法接收一个参数,这个参数是一个枚举,那么可以通过|符号,连接多个枚举值
  • 获得NSCalendar对象

NSCalendar *calendar = [NSCalendar currentCalendar];
  • 获得年月日
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
    NSDate *date = [NSDate date];
    // 1.创建日历对象
    NSCalendar *calendar = [NSCalendar currentCalendar];
    // 2.利用日历对象获取年月日时分秒
    NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    NSDateComponents *cmps =[calendar components:type fromDate:date];
    NSLog(@"year = %lu", cmps.year);
    NSLog(@"month = %lu", cmps.month);
    NSLog(@"day = %lu", cmps.day);
    NSLog(@"hour = %lu", cmps.hour);
    NSLog(@"minute = %lu", cmps.minute);
    NSLog(@"second = %lu", cmps.second);
    NSLog(@"date = %@", date);
  • 比较两个日期的差距
    • - (NSDateComponents )components:(NSCalendarUnit)unitFlags fromDate:(NSDate )startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
  // 1.确定时间
    NSString *time1 = @"2015-06-23 12:18:15";
    NSString *time2 = @"2015-06-28 10:10:10";
    // 2.将时间转换为date
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *date1 = [formatter dateFromString:time1];
    NSDate *date2 = [formatter dateFromString:time2];
    // 3.创建日历
    NSCalendar *calendar = [NSCalendar currentCalendar];
     NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    // 4.利用日历对象比较两个时间的差值
    NSDateComponents *cmps = [calendar components:type fromDate:date1 toDate:date2 options:0];
    // 5.输出结果
    NSLog(@"两个时间相差%ld年%ld月%ld日%ld小时%ld分钟%ld秒", cmps.year, cmps.month, cmps.day, cmps.hour, cmps.minute, cmps.second);

posted on 2015-08-05 23:54  MJ_Angel  阅读(1451)  评论(0编辑  收藏  举报

导航