今天犯二了,搞一个locationManager一直不起作用,在加上权限声明后didupdatelocation这个必定会执行的方法还是没执行,用网上的代码粘贴就能用,我是百思不得其解。
后来终于发现问题根源:我只用@property声明,viewDidLoad方法里面没有实例化
在追悔自己2的时候,还纳闷系统为什么不报错呢?
网上没找到答案,自己猜测:
- 对象的声明:只是在栈上开辟了一个(固定大小?)空间(即指针地址)(2.对象的声明和基本变量都是放在栈上的)
- 初始化时:会在堆内存分配该对象所需大小的空间(alloc)及正确的初始化(init)
- 把初始化跟声明连接时:就把堆内存的地址(相当于门牌号)写进了该对象位于的栈空间里。
- 基本类型因为是存储在栈上的,声明的时候就已经分配内存了。
CLLocationManager *locationManager; //只声明一个对象(栈里开辟了一个存放指针地址的空间) [[CLLocationManager alloc]init]; //只在堆中开辟了一块该对象的实际空间 locationManager = [[CLLocationManager alloc]init]; //绑定到一起 [locationManager requestWhenInUseAuthorization];//调用对象方法,不绑定实际地址也不会报错,但你会发现不起作用
关于为什么没有绑定堆数据的对象,也能调用方法,我想可能是:
声明对象的过程实际就是在堆里开辟了一个容纳指针(相当于遥控器或门牌号)的空间,由于声明对象过程中肯定写了这个是谁的对象,所以系统会检查你这个对象(虽然不知道具体对象是谁,因为还没绑定,或者叫分配)所能用的属性,所以在设置属性或者方法的时候,系统没有报错。
到这一步,系统只不过说,“有某一个客人他穿了什么衣服,做了什么事”
但是这个客人是谁?不知道,因为没有绑定具体的地址,指针里面是空的,也许全是0,没有具体客人房间的号码。
所以可以调用方法,但是不会起作用,因为没有指定具体的人,那自然也就没办法去做这些事了。