Objective-C 2.0不常见语法总结

打印内存地址

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类型的指针。
    Objective-C 2.0不常见语法总结_第1张图片
    输出参数
- (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*,即指针所指的对象会在方法执行完毕后自动释放。

指针的指针

即指针的存储地址可存放在指针中


指针的指针.png
  • 举例
    如图所示
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"

未完待续

你可能感兴趣的:(Objective-C 2.0不常见语法总结)