iOS 深度好文

iOS白话串2-void、void * 、id、NSObject

2018-08-14  本文已影响253人  Jacob_LJ

1 void、void * 、id

1.1 void 和 void *

1.1.1 void

1.1.2 void *

为什么不用void表示任意类型的数据呢?
大家都知道,C/C++是静态类型的语言,定义变量就会分配内存,然而,不同类型的变量所占内存不同,如果定义一个任意类型的变量,如何为其分配内存呢?所以,C、C++中没有任意类型的变量。
但是,所有指针类型的变量,无论是int、char、string、Student等等,他们的内存空间都是相同的,所以可以定义“任意类型的指针”。

不允许使用void * 指针操作它所指向的对象,例如,不允许对void * 指针进行解引用
不允许对void * 指针进行算术操作

1.1.2 REF

C语言void关键字_C语言中文网
C/C++中的函数中的void和void* 理解 - 程序园

1.2 id、NSObject

1.2.1 id 定义 和 官方解析-id

id define
id aObject = nil;
[aObject appendString:@"xx"];

1.2.2 NSObject

1.2.3 id 和 NSObject 定义对比

NSObject定义:typedef struct objc_object NSObject;
id 定义typedef struct objc_object *id;
其中 objc_object 定义:

/// Represents an instance of a class.
struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

1.2.4 id 等同于 NSObject *吗

REF

1.3 id 和 void *

2 nil、Nil、NSNull、NULL

NSString *str = nil;
Class someClass = Nil;
NSArray *arr = @[@"1", @"2", @"3", [NSNull null]];
// void * 类型的 context 参数,一般使用调用时,如果想不传参给 context,此时正确做法是传入 NULL
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;

[self.person1 addObserver:self forKeyPath:@"age" options: NSKeyValueObservingOptionNew context:NULL]
上一篇下一篇

猜你喜欢

热点阅读