字符串与基本数据类型转换 获取字符串的每个字符/字符串和其他数据类型转换
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);

OC-基础数据类型的更多相关文章

  1. OC基础--数据类型与表达式

    前言 做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱.所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础.UI控 ...

  2. OC基础数据类型-NSNumber

    1.NSNumber:专门用来装基础类型的对象,把整型.单精度.双精度.字符型等基础类型存储为对象 //基本数据类型 //专门用来装基础类型的对象 NSNumber * intNumber = [[N ...

  3. OC基础数据类型-NSString

    1.字符串的初始化 //字符串的初始化 NSString *str = @"Hello world!"; NSString *str2 = [[NSString alloc] in ...

  4. OC基础数据类型-NSData-NSMutableData-NSString

    NSData和NSMutableData存储的是二进制数据,在文件操作,网络,以及核心图形图像中使用较广泛.NSData创建后不可以再修改,NSMutableData可以再次修改. 1.NSStrin ...

  5. OC基础数据类型-NSSet

    1.集合:集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址:不过NSArray是有序的集合,NSSet是无序的集合.集合是一种哈希表,运用散列算法,查找集合中的元素比数组 ...

  6. OC基础数据类型-NSData

    1.NSData,数据,当我们需要把一些信息写入到文件里或发送到网络上,我们需要把这些数据转换下,变成纯粹的0.1字符流 1 NSString * str = @"hello, world! ...

  7. 【转】 OC基础数据类型-NSSet

    原文 : http://www.cnblogs.com/GISerYang/p/3340937.html 1.集合:集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址:不过 ...

  8. OC基础数据类型-NSValue

    1.NSValue:将指针等复杂的类型存储为对象 struct sct { int a; int b; }sctt; NSValue * value = [[NSValue alloc] initWi ...

  9. OC基础数据类型-NSDictionary

    1.字典NSDictionary 字典与数组的区别:数组讲究顺序,而字典可以快速帮助我们找到数据,数据是我们的目的,键是我们的手段 NSDictionary *dict = [[NSDictionar ...

  10. OC基础数据类型-NSArray

    1.数组的初始化 NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @&quo ...

随机推荐

  1. linux下c语言实现简单----线程池

    这两天刚好看完linux&c这本书的进程线程部分,学长建议可以用c语言实现一个简单的线程池,也是对线程知识的一个回顾与应用.线程的优点有好多,它是"轻量级的进程",所需资源 ...

  2. ELK集群之logstash(5)

    Logstash工作原理   Logstash事件处理有三个阶段:inputs → filters → outputs.是一个接收,处理,转发日志的工具.支持系统日志,webserver日志,错误日志 ...

  3. Django开发 X-Frame-Options to deny 报错处理

    本博客已停更,请转自新博客查看 https://www.whbwiki.com/318.html 错误提示 Refused to display 'http://127.0.0.1:8000/inde ...

  4. Go语言核心36讲(Go语言实战与应用四)--学习笔记

    26 | sync.Mutex与sync.RWMutex 从本篇文章开始,我们将一起探讨 Go 语言自带标准库中一些比较核心的代码包.这会涉及这些代码包的标准用法.使用禁忌.背后原理以及周边的知识. ...

  5. Python 爬取 拉钩

    ... from urllib import request from urllib import parse from urllib.error import URLError import jso ...

  6. 新装centos机器基础配置之基础软件包安装

    新装系统在做完基础的基线配置和加固还有yum源配置,还要安装一些基础软件.以备后期安装不便. centos6和7都可安装类基础包 yum install tree nmap dos2unix lsof ...

  7. 测试平台系列(79) 编写Redis配置功能(下)

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们提出了优化Dao ...

  8. [uoj76]懒癌

    为了方便,称患有懒癌的狗为"坏狗" 记$Q_{i}$为第$i$个人能观察的狗集合,$S$为坏狗集合,那么第$k$天第$i$个人能得到的信息有且仅有$S\ne \empty$.$S\ ...

  9. [bzoj1691]挑剔的美食家

    考虑将奶牛和牧草放在一起,根据鲜嫩程度排序,那么显然就可以发现一个贪心策略:每一头奶牛一定选择当前剩余的最便宜且符合条件的牧草,然后用一个set维护价格即可 1 #include<bits/st ...

  10. [bzoj4945]游戏

    暴力枚举$2^{d}$表示这d个点中一定不选A或一定不选B(那么就包含了所有情况),然后就对原图跑2-sat即可注意一个细节,如果某一条限制中初始点不合法,就不用管了:如果最终点不合法,那么相当于初始 ...