【Objective-C】类与结构体的区别

  • 只能在类里面写方法,不能在结构体里面写方法
  • 类——对象,结构体——值
  • 类——引用类型
    • 位于栈上的指针(引用)
    • 位于堆上的实体对象
  • 结构体——值类型
    • 实例直接位于栈中
  • 拷贝行为:
    • classname *a = b; a和b都是指针(指针存储在栈上),都指向同一个对象(对象存储在堆中),对象的值改变,a和b同时改变
    • structname a = b; 进行的是值拷贝(复制值后存储在栈上),如果改变b的值,a的值不会跟着改变
  • 传参行为:
    • 传参的本质上就是拷贝,因为对象传入的是指针,所以值改变的函数调用完毕之后,对象的值会改变,而结构体的值不会改变(因为结构体是值传递)
    • 在main函数调用子函数的时候,系统会为子函数建立一个栈,对象传参后存放的是引用(指针),结构体传参后存储的是结构体的值的拷贝

【Objective-C】栈(stack)和堆(heap)的区别

栈(stack)和堆(heap)的区别:

  • 栈:存储值类型(有时候翻译成“堆栈”)
    • 无ARC(自动引用计数)负担,由系统自动管理,以执行函数为单位(一个函数一个栈)
    • 空间大小编译时决定(根据参数和局部变量可以确定)
    • 函数执行时,系统自动分配一个栈
    • 函数执行结束,系统会立即回收stack
    • 函数之间通过拷贝值传递
    • 具有局限性,大小有限额,超出会stack overflow(栈溢出)(一般是超大递归、死循环情况)

  • 堆:存储引用类型对象
    • 分配由程序员手动请求([a alloc])(c语言里面的malloc)
    • 释放有两种方式,可以手工,也可以ARC机制自动释放
    • 函数之间通过拷贝引用(指针)传递
    • 具有全局性,总体大小无限制(受限于系统内存整体大小)

【Objective-C】java中的interface与Objective-C中的interface的区别

 

  • java中的interface
    • interface叫做接口,是一种特殊的抽象类
    • 一个接口中,所有方法为公开、抽象方法;所有的属性都是公开、静态、常量。
    • 一个类只能继承一个类,但是能实现多个接口,这样可以实现变相的多继承
    • 接口和接口之间也可以是继承关系,而且允许接口之间实现多继承
    • 类必须实现接口中的方法,否则它是一个抽象类

  • Objective-C中的@interface
    • Objective-C里面的@interface与java里面的interface不一样,就是写在头文件里面的,作为类的一个外界可以调用的函数的声明

    • 最好将Objective-C中的interface理解为“类的声明部分”,protocol理解为“正式协议”,protocol相当于java中的interface
    • interface和implementation共同代表一个类,两者的组合相当于java中的class

presentViewController:navigationController animated:YES completion:^(void)

xcode 6.0新增:

取而代之的是:

新接口的差别是提供了一个参数,允许你传入一个block。这个block的回调方法在VCviewWillDisappear方法后调用。也就是被隐藏的VC对象被释放后运行回调。

这样做的好处:可以方便做多个UI效果之间的衔接和转换。无需的时候可以写 nil。

去除NSLog时间戳及其他输出信息

如果不想看见NSLog的时间戳以及其他输出信息,我们可以在前面自行添加宏定义

这样就会只出现要输出的内容,去除前面的时间戳和其他格式:

11111


更多的时候我们可以把它改成这样的宏定义:

这样我们打印的内容如下:
830DD49D-1CE7-4274-87E8-0E7FC5607B20

这样输出信息会出现对应输出语句的“文件名:行号”。