打印内存地址
float x = 32.1;
NSString *string = [NSString stringWithFormat:@"%@", @{@"title":@"xxx", @"num":@(x)}];
NSLog(@"%@,%p", string, string);
-
%p
:打印第二个string的内存地址
输出参数
以NSError
为例:NSError
一般会经由方法的“输出参数”返回给调用者。如下代码所示
- (BOOL)doSomething:(NSError **)error
传递给方法的参数是个指针,而该指针本身又指向另外一个指针,而这另外一个指针指向NSError
对象。这样一来,此方法不仅能有普通的返回值,而且还能经由“输出参数”把NSError
对象回传给调用者。用法如下:
- 使用方法
NSError *error = nil;
BOOL ret = [object doSomething:&error];
if (error) {
//There was an error
}
- 内部原理
该方法通过下列代码把NSError
对象传递到“输出参数”中。如下图所示,方框中代表的是当前内存中的实际数据,非该数据所在的内存地址。
或者可以按下图理解。error存储的是一个地址,error是指向NSError
类型的指针。
- (BOOL)doSomething:(NSError **)error
{
//Do something that may cause an error
if (/*therr was an error*/) {
if (error) {
//Pass the 'error' through the out-parameter
*error = [NSError errorWithDomain:domain code:code userInfo:userInfo];
}
return NO;
} else {
return YES;
}
}
- 补充说明
实际在使用ARC时,编译器会把方法签名中的NSError **
转换成NSError *__autoreleasing*
,即指针所指的对象会在方法执行完毕后自动释放。
指针的指针
即指针的存储地址可存放在指针中
- 举例
如图所示
int ival = 1024;
int *pi = &ival;
int **ppi = π
访问结构体成员
struct AAA {
int a;
int b;
}
struct AAA structA;
struct AAA *structB;
//用法
//定义的结构体如果是指针,访问成员时就用->
//定义的结构体如果是变量,访问成员时就用.
//structA.a
//structB->a
size_t
typedef unsigned int size_t //size_t的定义
- 根据
size_t
的字面意思看以看出,它是用来描述一个数据类型所占的内存大小的。因此需要保证能够存的下任何一种数据类型。 - 是
sizeof()
的结果类型
NSString中打印特殊字符#%"等
label.text = [NSString stringWithFormater:@"%d%%",10];//10%
label.text = [NSString stringWithFormater:@"/"%d/"",10];//"10"