文章目录

  • OC方法调用机制
  • new方法实现原理
  • 野指针
  • 内存溢出
  • 内存泄漏
  • alloc和init

OC方法调用机制

OC有两种方法

Person *person=[Person new];
[person eat];//对象方法
[Person personWithName:@"Tom"];//类方法

对象方法:要用对象指针调用
类方法:类方法要用类名调用

OC方法调用实际上就是在给接受者发送消息。
[接收者 消息];

在OC类的结构中,存在一个方法的调度表,表中存放的是我们各个方法的逻辑实现在内存空间中的地址,当向一个接受者发送消息的时候,会来到这个调度表中找到对应方法的指针,通过指针指向的逻辑实现的地址,去执行固定方法的逻辑实现。

new方法实现原理

Phone *phone=[Phone new];

1.给对象分配内存空间地址
2.给对象完成默认初始化操作
3.放回对象的空间地址
打印内存空间地址可以:

NSLog(@"%p",phone);

打印对象,会调用对象的description方法:

NSLog(@"%@",phone);

野指针

野指针的成因:主要是因为疏忽而删除或申请访问非法内存空间区域的指针。
任何指针创建时不会自动成为NULL 指针,它的缺省值是随机的,它会乱指一气。所以指针创建时要初始化,要么赋为NULL,要么指向合法的内存。

内存溢出

当你申请了10个字节的空间,但是在这个空间中写入了11或以上字节的数据,就是内存溢出。

内存泄漏

如果用new/malloc申请了一块内存,但是没有用delete或者free来将内存释放,导致这块内存一直被占用。

alloc和init

phone=[Phone alloc];

alloc只是给对象分配了内存空间地址
如果要初始化,还要调用init函数

phone=[phone init];

oc方法的一个联调,和上面的分步调用是等价的,由内而外依此来看(可以按住command键点进方法的声明):

Phone=[[Phone alloc]init]

new方法就是对alloc和new方法的一个封装,new方法的抽象程度更高,使用起来更方便,但是相对来说new的灵活度更差一些。

OC语言基础一:OC方法调用机制,new方法实现原理相关推荐

  1. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

  2. 方法调用机制内存分析★

    方法调用机制内存分析 对于下面的程序 Persion persion = new Persion();int returnRes =persion.sum(4,6);System.out.printl ...

  3. @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...

    Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...

  4. [黑马IOS自学第九篇]OC语言基础,面向对象概念,类的创建,OC多文件开发等

    Extends Coc .EnhancedCc++/ .C-like c# 会在github上开源一个库,如果是私有库要交钱,自己o公司的项目不要勾 会把源代码提交上去 <span style= ...

  5. 关于OC语言基础的总结

    原文地址:http://www.kankanews.com/ICkengine/archives/24423.shtml 1.OC的动态性 oc的动态性让程序可以在运行时判断其该有的行为,而不是像c等 ...

  6. OC语言基础 - 01

    OC语言源自于C语言,但是在C语言的基础上增加了不少OC特有的东西.因此有C语言和面向对象语言基础的同学还是可以很快掌握OC语言的. 在OC语言中,使用#import来代替C语言中的#include. ...

  7. OC语言基础内容 类的定义 第一个OC

    OC基础day01 第一个OC程序 OC与C的基本区别 C语言的源文件 XXX.c OC语言的源文件 XXX.m 在C语言中 用printf打印信息 OC中用NSLog()打印信息 OC中的改变 OC ...

  8. [黑马IOS自学第十篇]OC语言基础,面向对象概念,类学习

    一.类学习引入 //缺点 _result的结果一直在变化,得创建变量,在堆区一直申请空间 <span style="font-size:14px;">#import&l ...

  9. asp.net ajax1.0基础回顾(六):调用ASPX页面方法

    在aspx页面中,可能通过asp.net ajax调用其页面方法,具体设置如下. 1.服务器端代码(页面对象代码): using System.Web; using System.Web.Servic ...

最新文章

  1. 微信notify mysql_微信支付的notify.php中如何获取订单号(php版)
  2. 有源晶振和无源晶振的输出波形
  3. 为什么我写的c++程序在windows下比linux下要快,linux比windows快很多倍除了算法的优势 有没C比C++快的原因?...
  4. table 鼠标移上去改变单元格边框颜色。
  5. 沙特40米高超大遮阳伞,撑开有半个足球场大小,可覆盖整个广场
  6. 人脸照片不规范、如何更改?pupiIDistanceTooSmall 错误
  7. java实现归并排序
  8. Elasticsearch 集成 SpringBoot并进行CRUD操作
  9. Python基础之键盘操作
  10. 使用ADB命令,手机连接不上电脑的问题
  11. asyncio 系列五、同步原语—Synchronization Primitives
  12. ant design vue table 高度自适应_很受欢迎的vue前端UI框架
  13. jqfactor_analyzer源代码解读02
  14. ubuntu安装Kubernetes1.20.0
  15. MsysGIT -- Windows下GIT提供众多的Linux命令
  16. NFT会接力Defi,成为下一个热点么?
  17. 制造业ERP系统如何管理生产工序?具体流程有哪些?
  18. [关于Context]
  19. Robbins-Monro 随机逼近算法和序列学习(Sequential Learning)
  20. matlab mcr安装图标,MCR 安装文档--matlab 2010b

热门文章

  1. oracle jdbc jar位置,Oracle JDBC ojdbc6 Jar作为Maven依赖项
  2. 31-scrapy框架爬虫【简单应用】-3个例子
  3. 工业和信息化部教育与考试中心证书有用吗怎么报考 ?
  4. Quartus18.1自带仿真工具实现仿真
  5. Android动态图标包制作教程,IT之家教程:使用安卓图标包美化Windows 10
  6. 1.1 FPGA基础及电路设计
  7. SCI论文的类型以及写作结构分析
  8. Jquery方法实现图片放大缩小
  9. 操作系统课程设计--在Linux环境下模拟实现简单命令解释器(C++代码)
  10. elastic-job:参考elastic-console在自己代码中实现任务的失效、生效、终止操作