乐趣区

iOS知识梳理-Objc语法中值得注意的东西

属性声明

@property、@synthesize 和 @dynamic

objc 推荐我们通过 set/get 方法访问对象的属性。很显然,为每一个属性手动添加 set/get 方法的声明和实现是个性价比很低的重复劳动。因此,objc 提供了一些关键字帮助我们简化这一过程。这几个关键字实际上就是这么回事儿。

单独做了总结:Objective- C 的 @property、@synthesize 和 @dynamic

注释

常规的 ///* */就不多说了

值得一提的是 #pragma 语法,

我们可以用 #pragma mark - UITableViewDataSource 这样的写法来为代码分块,xcode 将会提供导航。

参考:#pragma

enum

typedef NS_ENUM(NSUInteger, TTGState) {
    TTGStateOK = 0,
    TTGStateError,
    TTGStateUnknow
};

参考

Enum in OC

空指针

  • NULL:C 的空指针 (void *)0
  • nil:objc 的空对象 (id)0
  • Nil: 空的类指针 (Class)0
  • NSNull:nil 的包装类,为了表示 dic 里面的某个 value 为空 [NSNull null]

总结:前三个数值上是相等的,在 objc 中用 nil 比较普遍

参考 nil / Nil / NULL / NSNull

BOOL

常见的就是 bool 和 BOOL。

bool 是 c 语言的,单独的一个类型(_Bool),在数值上 true = 1,false = 0

bool 类型只有 true 和 false 两种状态。

另外,条件判断语句在判断时,是以 0 为 false,非 0 为 true 进行判断的。

由此有以下结论:

2 == true // 假
(bool)2 == true // 真
2 // 真

BOOL 是 ObjC 定义的真假值类型,它在 64 位机器上等价于 bool,在 32 位机器上是 signed char

其定义如下,参考 objc4-750

/// Type to represent a boolean value.

#if defined(__OBJC_BOOL_IS_BOOL)
    // Honor __OBJC_BOOL_IS_BOOL when available.
#   if __OBJC_BOOL_IS_BOOL
#       define OBJC_BOOL_IS_BOOL 1
#   else
#       define OBJC_BOOL_IS_BOOL 0
#   endif
#else
    // __OBJC_BOOL_IS_BOOL not set.
#   if TARGET_OS_OSX || TARGET_OS_IOSMAC || (TARGET_OS_IOS && !__LP64__ && !__ARM_ARCH_7K)
#      define OBJC_BOOL_IS_BOOL 0
#   else
#      define OBJC_BOOL_IS_BOOL 1
#   endif
#endif

#if OBJC_BOOL_IS_BOOL
    typedef bool BOOL;
#else
#   define OBJC_BOOL_IS_CHAR 1
    typedef signed char BOOL; 
    // BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
    // even if -funsigned-char is used.
#endif

YES 和 NO

bool 的表现已经讲过,这里关注一下 BOOL 作为 signed char 的表现。

这时,一个 BOOL 类型的变量值范围是 -128~127,因此强制类型转换时可能会有异常:

BOOL boolVar = 256;
boolVar // 假
boolVar == 0 // 真

另外强制类型转换时也不会把值转为 0 和 1:

(BOOL)2 == true // 假

综上,使用时需注意:

  1. 使用条件表达式时不需要跟 YES、NO 进行比较,如 if(var == YES) 应当直接写成if(var)
  2. 不要把其它类型强制转换成 BOOL

参考:

  1. ObjC 的 BOOL 为什么要用 YES、NO 而不建议用 true、false?
  2. BOOL / bool / Boolean / NSCFBoolean

内存管理

TODO:后面总结梳理。

退出移动版