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


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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    SpringBoot开发中的坑 记录一些
    MongoDB 文档【行】
    MongoDB 集合【表】
    MongoDB 数据库
    MongoDB 基础
    gitlab或github下fork后如何同步源的新更新内容?
    解决:android源码同步repo sync 时出现的fatal:duplicate path错误
    android ROM刷机updater-script单刷补丁包脚本
    一键解包/打包boot.img/recovery.img工具(高通/MTK双版 支持android 5.1以上)
    解决:github上传时出现error: src refspec master does not match any
  • 原文地址:https://www.cnblogs.com/36bian/p/5248169.html
Copyright © 2020-2023  润新知