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

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

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

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

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

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

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

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

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

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

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

<完>

时间: 2024-08-07 21:58:27

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

类成员只声明不实现,调用时会怎么样?

测试结果是private和public两种情况是不同的. 测试代码是 class onlyDeclare { private: void priFunc(); public: void pubFunc(); }; void test() { onlyDeclare od; //od.pubFunc();//对'onlyDeclare::pubFunc()'未定义的引用 //od.priFunc();//'void onlyDeclare::priFunc()'是私有的 } 如果是private,

java的File类的 delete方法删不掉文件的原因分析

先举几个可以删除掉文件和删除不掉文件的例子(先在F盘创建test1.txt文件,然后可以直接拷贝代码到IDE执行),最后总结下原因: 例子一:下面的例子毫无疑问是能够删除掉文件的 import java.io.File; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { File file = new File("F:/test1.

JavaSE8基础 链式编程 调用方法返回对象再调方法 简单示例

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: class Person { public void sayHello() { System.out.println("hello world"); } } class Tools { public static Person getPersonObj() { return new Person()

通过Intent传递对象的两种方法

1 Serializable 2 Parcelable 实现方法: a.定义两个javaBean(Book,Person),分别implements Serializable和Parcelable b.建立Activity,用来传递Object对象和接收Object对象,通过Serializeable和Pacelable方法传递对象,分别调用方法 bundle.putSerializable(String key,Serializable value) bundle.putParcelable(

Objective-C学习笔记(十八)——对象方法和类方法的声明,定义及调用

在程序设计中,函数的使用无疑大大简化了代码的编写,提高代码运行的效率,减少重复代码.所以现在我们来详细研究一下方法.本例子还是以People类为例. (一)代码一: (1)先在People.h中声明一个方法,该方法为对象方法,也就是普通方法,前面是一个减号. -(void)show; (2)在People.m中实现该方法: -(void)show{ NSLog(@"我是一个对象方法,我被调用了!"); } (3)在main.m中调用该方法: People *people = [[Peo

java类(Class)的概念;对象的概念,声明类的属性 和方法,

类(Class)的概念 类是对一组具有相同特征和行为的对象的抽象描述. 理解: [1] 类包含了两个要素:特性和行为 => 同一类事物具有相同的特征和行为. [2] 类是一个群体性概念.例如:网红.明星.草根.宅男.萝莉.沙雕 [3] 类可以理解为现实生活中所说的 “类型” 为什么会有类的概念? 现实生活中为了更好的区分事物,把事物进行归类,进而更好的认识事物. 在程序中,引入类的概念,就是为了快速生成更多的具有相同特性和行为的事物 对象的概念 对象是类的具体实现,表示一个独立的.唯一的个体.

波哥学JAVA,定义类 创建对象 实例化对象 属性 类调用属性或者方法

定义类 声明对象  创建对象 实例化对象 属性 对象调用属性或者方法 举例,下面定义类了一个类并声明属性,写了一个方法: 创建对象 实例化对象 属性 类调用属性或者方法

第三次博客作业package com.fry; //导入java.util.Arrays; import java.util.Arrays; public class Demo1 { public static void main(String[]args){ //创建对象,对象名为hello Demo1 hello =new Demo1(); //调用方法并将返回值保存在变量中

1.  某网站管理系统,用户注册时,电话号码为可选输入项,输入格式为:区号-电话号码—分机号,中间用“-”隔开.以下为jsp页面上的设计,且并未对输入做任何控制. 假设系统现在需要取出中间的电话号码部分,代码如下: /** * * 该方法根据用户输入取出中间的电话号码部分 * @param strPhoneNum 电话号码,如:“0591-83279988—002” * @return 返回号码部分,如:“83279988” */ public String getPhoneNumber(Str

一起写框架-Ioc内核容器的实现-对象的调用-方法注入容器的对象(十一)

实现功能 就是在方法的上面加入@Autowired注解,容器中的对象会注入到对应类型的参数. 注意:暂时实现注入一个对象.所有方法的参数列表的参数只能有一个. 实现思路 其实实现的思路和给字段注入的逻辑是一样的.遍历类所有的方法有没有@Autowired,有的就给它赋予容器中对应的对象. 实现步骤 1. 在AbstractApplicationContext类增加两个方法区分属性注入(autowiredField)和方法注入(autowiredMethod) 1 /** 2 * 属性注入 3 *