Objective-C 知识点(一)

2015-08-28  本文已影响237人  黄龙辉
  1. BOOL的实际类型是signed char,所以赋值给BOOL类型时,可能会出现截断的情况。
  2. #define指令把YES定义为1,NO定义为0。所以不要将BOOL类型直接和YES或者NO进行比较。
  3. 使用NSLog输出对象时,会调用对象的description方法。所以通过重载NSObjectdescription方法,可以自定义打印对象的内容。若想在调试时,用LLDB的po命令输出更详细的信息,可以实现debugDescription。在NSObject的默认实现中,它只是简单调用了description方法。
  4. NSValue类型可以存储任意值。通过将结构体、枚举值转化为NSValue,就可以存放到数组和字典中。
    转化:
    NSRect rect = NSRectMake(1, 2, 3, 4);
    NSValue *value = NSValue valueWithBytes:&rect objCType:@encode(NSRect);
    [array addObject:value];
    提取:
    value = [array objectAtIndex:0];
    [value getValue:&rect];
  5. 事件循环:一个典型的图形应用程序往往花费许多时间等待用户操作。在控制程序运行的人慢腾腾地作出决定(比如点击鼠标或按下某个键)以前,程序将一直处于空闲状态。当发生这样的事件时,程序将被唤醒并开始工作,执行必要的操作以响应这一事件。在处理完这事件后,程序返回到休眠状态并等待下一个事件发生。为了降低程序的内存空间占用,cocoa会在程序开始处理事件之前创建一个自动释放池,并在事件处理结束后销毁。这样可以尽量减少累 积的临时对象的数量。
  6. 自动释放池被清理的时间是完全确定的。要么是在代码中,自己手动销毁,要么是使用AppKit时,在事件循环结束时销毁。
  7. 使用ARC进行内存管理时,不能简单的将可保留对象指针(ROP)表示成不可保留对象指针(non-ROP)。因为ARC无法对不可保留对象进行内存管理,所以需要明确所有权问题和对不可保留对象手动进行内存管理。

桥接转换可以明确所有权的问题,包括三个关键字:__bridge__bridge_retained__bridge_transfer

  1. 结构体和集合体中不能使用ROP作为成员,可以通过void *和桥接转换来解决这个问题.
  2. 非正式协议(声明NSObject的类别):
    @interface NSObject(NetWorkDeal)
    - (void)networkFail;
  3. 自定义类实现了NSCopy协议,则需要实现copyWithZone方法,如下
    - (id)copyWithZone:(NSZone *)zone{
    TestClass *test;
    test = [[[self class] allocWithZone:zone] init];
    return test;
    }
  4. 代码块声明:
    void (^ myBlock)(int i);
    代码块定义:
    myBlock = ^(int i){
    return i;
    }
    typedef 使用:
    typedef void (^ MyBlock)(int i);
    MyBlock myBlock = ^(int i){
    return i;
    }

代码块定义时,会复制并保存本地变量(非静态、未加__block修饰)的状态。

  1. GCD队列相关操作:
  1. NSPropertyListSerialization可以为存储和加载属性列表提供便利:
    存储:
    NSString *error = nil;
    NSData *data = [NSPropertyListSerialization dataFromPropertyList:nameArray format:NSPropertyListBinaryFormat_v1_0 errorDescrioption:&error];
    [data writeToFile:@"/tmp/name.txt"];`
    加载:
    NSPropertyListFormat propertyListFormat = NSPropertyListXMLFormat_v1_0 ;
    NSString *error = nil;
    NSMutableArray *nameArray = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&propertyListFormat errorDescription:&error];
  2. 对象的序列化和反序列化,需要类实现NSCoding协议。NSKeyedArchiver和NSKeyedUnarchiver可以对对象进行序列化和反序列化。
    序列化:
    NSData *data = [NSKeyedArchiver archiveDataWithRootObject:object];
    反序列化:
    [NSKeyedUnarchiver unarchiveObjectWithData:data];
  3. Foundation框架定义了两个和枚举有关的宏:

根据上面的描述,在需要进行按位运算时,采用NS_OPTIONS,其它情况可以使用NS_ENUM

上一篇 下一篇

猜你喜欢

热点阅读