- 只能在类里面写方法,不能在结构体里面写方法
- 类——对象,结构体——值
- 类——引用类型
- 位于栈上的指针(引用)
- 位于堆上的实体对象
- 结构体——值类型
- 实例直接位于栈中
- 拷贝行为:
- classname *a = b; a和b都是指针(指针存储在栈上),都指向同一个对象(对象存储在堆中),对象的值改变,a和b同时改变
- structname a = b; 进行的是值拷贝(复制值后存储在栈上),如果改变b的值,a的值不会跟着改变
- 传参行为:
- 传参的本质上就是拷贝,因为对象传入的是指针,所以值改变的函数调用完毕之后,对象的值会改变,而结构体的值不会改变(因为结构体是值传递)
- 在main函数调用子函数的时候,系统会为子函数建立一个栈,对象传参后存放的是引用(指针),结构体传参后存储的是结构体的值的拷贝
标签: Objective-C
【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不一样,就是写在头文件里面的,作为类的一个外界可以调用的函数的声明
1234567@interface RPoint : NSObject@property int x;@property int y;-(void)print;@end- 最好将Objective-C中的interface理解为“类的声明部分”,protocol理解为“正式协议”,protocol相当于java中的interface
- interface和implementation共同代表一个类,两者的组合相当于java中的class
presentViewController:navigationController animated:YES completion:^(void)
xcode 6.0新增:
1 2 3 |
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated; - (void)dismissModalViewControllerAnimated:(BOOL)animated; |
取而代之的是:
1 2 3 4 5 6 7 8 9 10 |
[self presentViewController:navigationController animated:YES completion:^(void){ // Code }]; [self dismissViewControllerAnimated:YES completion:^(void){ // Code }]; |
新接口的差别是提供了一个参数,允许你传入一个block。这个block的回调方法在VC的viewWillDisappear方法后调用。也就是被隐藏的VC对象被释放后运行回调。
这样做的好处:可以方便做多个UI效果之间的衔接和转换。无需的时候可以写 nil。
去除NSLog时间戳及其他输出信息
如果不想看见NSLog的时间戳以及其他输出信息,我们可以在前面自行添加宏定义
1 |
#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]) |
这样就会只出现要输出的内容,去除前面的时间戳和其他格式:
更多的时候我们可以把它改成这样的宏定义:
1 |
#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); |
这样我们打印的内容如下:
这样输出信息会出现对应输出语句的“文件名:行号”。