只声明对象也能调用方法但不起作用的原因分析

Posted 三十六变

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只声明对象也能调用方法但不起作用的原因分析相关的知识,希望对你有一定的参考价值。

今天犯二了,搞一个locationManager一直不起作用,在加上权限声明后didupdatelocation这个必定会执行的方法还是没执行,用网上的代码粘贴就能用,我是百思不得其解。

后来终于发现问题根源:我只用@property声明,viewDidLoad方法里面没有实例化

在追悔自己2的时候,还纳闷系统为什么不报错呢?

网上没找到答案,自己猜测:

  1. 对象的声明:只是在栈上开辟了一个(固定大小?)空间(即指针地址)(2.对象的声明和基本变量都是放在栈上的)
  2. 初始化时:会在堆内存分配该对象所需大小的空间(alloc)及正确的初始化(init)
  3. 把初始化跟声明连接时:就把堆内存的地址(相当于门牌号)写进了该对象位于的栈空间里。
  1. 基本类型因为是存储在栈上的,声明的时候就已经分配内存了。
CLLocationManager *locationManager; //只声明一个对象(栈里开辟了一个存放指针地址的空间)
[[CLLocationManager alloc]init]; //只在堆中开辟了一块该对象的实际空间
locationManager = [[CLLocationManager alloc]init]; //绑定到一起
[locationManager requestWhenInUseAuthorization];//调用对象方法,不绑定实际地址也不会报错,但你会发现不起作用

关于为什么没有绑定堆数据的对象,也能调用方法,我想可能是:

声明对象的过程实际就是在堆里开辟了一个容纳指针(相当于遥控器或门牌号)的空间,由于声明对象过程中肯定写了这个是谁的对象,所以系统会检查你这个对象(虽然不知道具体对象是谁,因为还没绑定,或者叫分配)所能用的属性,所以在设置属性或者方法的时候,系统没有报错。

到这一步,系统只不过说,有某一个客人他穿了什么衣服,做了什么事

但是这个客人是谁?不知道,因为没有绑定具体的地址,指针里面是空的,也许全是0,没有具体客人房间的号码。

所以可以调用方法,但是不会起作用,因为没有指定具体的人,那自然也就没办法去做这些事了。

<完>

以上是关于只声明对象也能调用方法但不起作用的原因分析的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式调用 UIRefreshControl 不起作用

将 File 对象传递给函数的问题

aop声明式事务不起作用的原因

SoundPool 加载失败

Java noobie:for循环调用方法不起作用

Visual Studio 自定义代码片段在方法定义的参数列表中不起作用