Objective-C加强3Foundation框架

NSDictionary
  什么是NSDictionary
  NSDictionary翻译过来叫做”字典
  日常生活中, “字典”的作用: 通过一个拼音或者汉字, 就能找到对应的详细解释
  NSDictionary的作用类似: 通过一个key, 就能找到对应的value
  NSDictionary不可变的, 一旦初始化完毕, 里面的内容就无法修改

  NSDictionary的创建
    + (instancetype)dictionary;
    + (instancetype)dictionaryWithObject:(id)object forKey:(id <NSCopying>)key;
    + (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...;
    + (id)dictionaryWithContentsOfFile:(NSString *)path;
    + (id)dictionaryWithContentsOfURL:(NSURL *)url;

NSDictionary的常见使用
  - (NSUInteger)count;    
    返回字典的键值对数目

  - (id)objectForKey:(id)aKey;
    根据key取出value

  将字典写入文件中
  - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
  - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;

NSDictionary的遍历
  快速遍历
  for (NSString *key in dict) { }

  Block遍历
  [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    
  }];

NSDictionary的简写
  NSDictionary的创建
    以前
    [NSDictionary dictionaryWithObjectsAndKeys:@"Jack", @"name", @"男", @"sex", nil];

    现在
    @{@"name": @"Jack", @"sex" : @"男”};

  NSDictionary获取元素
    以前
    [dict objectForKey:@"name”];

    现在
    dict[@"name”];

NSMutableDictionary
  什么是NSMutableDictionary
  NSMutableDictionaryNSDictionary的子类
  NSDictionary不可变的, 一旦初始化完毕后, 它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
  NSMutableDictionary可变的, 随时可以往里面添加\更改\删除元素

NSMutableDictionary的常见操作
  - (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
    添加一个键值对(会把aKey之前对应的值给替换掉)

  - (void)removeObjectForKey:(id)aKey;
    通过aKey删除对应的value

  - (void)removeAllObjects;
    删除所有的键值对

NSMutableDictionary的简写
  设置键值对
  以前
  [dict setObject:@"Jack" forKey:@"name”];

  现在
  dict[@"name"] = @"Jack";


NSFileManager
  什么是NSFileManager
  顾名思义, NSFileManager是用来管理文件系统
  它可以用来进行常见的文件\文件夹操作

  NSFileManager使用了单例模式

  使用defaultManager方法可以获得那个单例对象
  [NSFileManager defaultManager]

NSFileManager的常见判断
  - (BOOL)fileExistsAtPath:(NSString *)path;
    path这个文件\文件夹是否存在

  - (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;
    path这个文件\文件夹是否存在, isDirectory代表是否为文件夹

  - (BOOL)isReadableFileAtPath:(NSString *)path;
    path这个文件\文件夹是否可读

  - (BOOL)isWritableFileAtPath:(NSString *)path;
    path这个文件\文件夹是否可写

  - (BOOL)isDeletableFileAtPath:(NSString *)path;
    path这个文件\文件夹是否可删除

NSFileManager的文件访问
  - (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;
    获得path这个文件\文件夹的属性

  - (NSArray *)subpathsAtPath:(NSString *)path;
  - (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
    获得path的所有子路径

  - (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
    获得path的当前子路径

  - (NSData *)contentsAtPath:(NSString *)path;
    获得文件内容

NSFileManager的文件操作
  - (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
  拷贝
  - (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
  移动(剪切)
  - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
  删除
  - (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;
  创建文件夹(createIntermediates为YES代表自动创建中间的文件夹)

  - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
  创建文件
  (NSData是用来存储二进制字节数据的)

文件下载的简单思路

NSPoint\CGPoint
  CGPoint和NSPoint是同义的
  typedef CGPoint NSPoint;

  CGPoint的定义
    struct CGPoint {
      CGFloat x;
      CGFloat y;
    };
  typedef struct CGPoint CGPoint;
  typedef double CGFloat;

  CGPoint代表的是二维平面中的一个点
  可以使用CGPointMakeNSMakePoint函数创建CGPoint

NSSize\CGSize
  CGSize和NSSize是同义的
  typedef CGSize NSSize;

  CGSize的定义
    struct CGSize {
       CGFloat width;
       CGFloat height;
         };
  typedef struct CGSize CGSize;

  CGSize代表的是二维平面中的某个物体的尺寸(宽度和高度)
  可以使用CGSizeMakeNSMakeSize函数创建CGSize

NSRect\CGRect
  CGRect和NSRect是同义的
  typedef CGRect NSRect;

  CGRect的定义
    struct CGRect {
        CGPoint origin;
        CGSize size;
    };
  typedef struct CGRect CGRect;

  CGRect代表的是二维平面中的某个物体的位置和尺寸
  可以使用CGRectMake和NSMakeRect函数创建CGRect

NSNumber
  NSArray\NSDictionary中只能存放OC对象, 不能存放int\float\double等基本数据类

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

  

 

NSNumber的创建
  以前
    + (NSNumber *)numberWithInt:(int)value;
    + (NSNumber *)numberWithDouble:(double)value;
    + (NSNumber *)numberWithBool:(BOOL)value;

  现在
    @10;
    @10.5;
    @YES;
    @(num);

NSNumber的常用方法
  从NSNumber中取出之前包装的基本数据类型
    - (char)charValue;
    - (int)intValue;
    - (long)longValue;
    - (double)doubleValue;
    - (BOOL)boolValue;
    - (NSString *)stringValue;

  - (NSComparisonResult)compare:(NSNumber *)otherNumber;
  - (BOOL)isEqualToNumber:(NSNumber *)number;

NSValue
  NSNumberNSValue的子类, 但NSNumber只能包装数字类型

  NSValue可以包装任意值

  因此, 可以用NSValue将结构体包装后, 加入NSArray\NSDictionary中


常见结构体的包装
  为了方便 结构体NSValue 的转换, Foundation提供了以下方法
  将结构体包装成NSValue对象
    + (NSValue *)valueWithPoint:(NSPoint)point;
    + (NSValue *)valueWithSize:(NSSize)size;
    + (NSValue *)valueWithRect:(NSRect)rect;

  从NSValue对象取出之前包装的结构体
    - (NSPoint)pointValue;
    - (NSSize)sizeValue;
    - (NSRect)rectValue;

任意数据的包装
  NSValue提供了下列方法来包装任意数据
  + (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
    value参数 : 所包装数据的地址
    type参数 : 用来描述这个数据类型的字符串, 用@encode指令来生成

  从NSValue中取出所包装的数据
  - (void)getValue:(void *)value;

NSDate
  NSDate可以用来表示时间, 可以进行一些常见的日期\时间处理

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

  [NSDate date]返回的就是当前时间

NSDate日期格式化
  NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  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]);

NSCalendar
  结合NSCalendarNSDate能做更多的日期\时间处理

  获得NSCalendar对象
  NSCalendar *calendar = [NSCalendar currentCalendar];

  获得年月日
  - (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;

  比较两个日期的差距
  - (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)startingDate

                   toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;

NSObject
  NSObject可以是所有类的基类, 内部定义了很多常用的方法


  - (BOOL)isKindOfClass:(Class)aClass;
    判断是否为aClass或者aClass的子类的实例

  - (BOOL)isMemberOfClass:(Class)aClass
    判断是否为aClass的实例(不包括aClass的子类)

  - (BOOL)conformsToProtocol:(Protocol *)aProtocol
    判断对象是否实现了aProtocol协议

  - (BOOL)respondsToSelector:(SEL)aSelector
    判断对象是否拥有参数提供的方法

  - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
    延迟调用参数提供的方法,方法所需参数用withObject传入

NSString的其他使用场合


  通过类名的字符串形式实例化对象
    Class class = NSClassFromString(@"Student");
    Student *stu = [[class alloc] init];

  将类名变成字符串
    Class class = [Student class];
    NSString *className = NSStringFromClass(class);

  通过方法的字符串形式实例化方法
    SEL selector = NSSelectorFromString(@"setName:");
    [stu performSelector:selector withObject:@"Mike"];

  将方法变成字符串
  NSStringFromSelector(@selector(setName:));


集合的内存管理
  集合,就是能用来容纳OC对象的容器
  NSArray、NSDictionary等都是

  集合有一些内存管理细节
  只要将一个对象添加到集合中,这个对象计数器就会 + 1(做一次retain操作)
  只要将一个对象从集合中移除,这个对象计数器就会 - 1(做一次release操作)
  如果集合被销毁了,集合里面的所有对象计数器都会 - 1(做一次release操作)



posted @ 2017-02-06 15:53  laugh  阅读(207)  评论(0编辑  收藏  举报