OC语言基础一:OC方法调用机制,new方法实现原理
文章目录
- 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方法实现原理相关推荐
- java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...
最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...
- 方法调用机制内存分析★
方法调用机制内存分析 对于下面的程序 Persion persion = new Persion();int returnRes =persion.sum(4,6);System.out.printl ...
- @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...
Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...
- [黑马IOS自学第九篇]OC语言基础,面向对象概念,类的创建,OC多文件开发等
Extends Coc .EnhancedCc++/ .C-like c# 会在github上开源一个库,如果是私有库要交钱,自己o公司的项目不要勾 会把源代码提交上去 <span style= ...
- 关于OC语言基础的总结
原文地址:http://www.kankanews.com/ICkengine/archives/24423.shtml 1.OC的动态性 oc的动态性让程序可以在运行时判断其该有的行为,而不是像c等 ...
- OC语言基础 - 01
OC语言源自于C语言,但是在C语言的基础上增加了不少OC特有的东西.因此有C语言和面向对象语言基础的同学还是可以很快掌握OC语言的. 在OC语言中,使用#import来代替C语言中的#include. ...
- OC语言基础内容 类的定义 第一个OC
OC基础day01 第一个OC程序 OC与C的基本区别 C语言的源文件 XXX.c OC语言的源文件 XXX.m 在C语言中 用printf打印信息 OC中用NSLog()打印信息 OC中的改变 OC ...
- [黑马IOS自学第十篇]OC语言基础,面向对象概念,类学习
一.类学习引入 //缺点 _result的结果一直在变化,得创建变量,在堆区一直申请空间 <span style="font-size:14px;">#import&l ...
- asp.net ajax1.0基础回顾(六):调用ASPX页面方法
在aspx页面中,可能通过asp.net ajax调用其页面方法,具体设置如下. 1.服务器端代码(页面对象代码): using System.Web; using System.Web.Servic ...
最新文章
- 微信notify mysql_微信支付的notify.php中如何获取订单号(php版)
- 有源晶振和无源晶振的输出波形
- 为什么我写的c++程序在windows下比linux下要快,linux比windows快很多倍除了算法的优势 有没C比C++快的原因?...
- table 鼠标移上去改变单元格边框颜色。
- 沙特40米高超大遮阳伞,撑开有半个足球场大小,可覆盖整个广场
- 人脸照片不规范、如何更改?pupiIDistanceTooSmall 错误
- java实现归并排序
- Elasticsearch 集成 SpringBoot并进行CRUD操作
- Python基础之键盘操作
- 使用ADB命令,手机连接不上电脑的问题
- asyncio 系列五、同步原语—Synchronization Primitives
- ant design vue table 高度自适应_很受欢迎的vue前端UI框架
- jqfactor_analyzer源代码解读02
- ubuntu安装Kubernetes1.20.0
- MsysGIT -- Windows下GIT提供众多的Linux命令
- NFT会接力Defi,成为下一个热点么?
- 制造业ERP系统如何管理生产工序?具体流程有哪些?
- [关于Context]
- Robbins-Monro 随机逼近算法和序列学习(Sequential Learning)
- matlab mcr安装图标,MCR 安装文档--matlab 2010b
热门文章
- oracle jdbc jar位置,Oracle JDBC ojdbc6 Jar作为Maven依赖项
- 31-scrapy框架爬虫【简单应用】-3个例子
- 工业和信息化部教育与考试中心证书有用吗怎么报考 ?
- Quartus18.1自带仿真工具实现仿真
- Android动态图标包制作教程,IT之家教程:使用安卓图标包美化Windows 10
- 1.1 FPGA基础及电路设计
- SCI论文的类型以及写作结构分析
- Jquery方法实现图片放大缩小
- 操作系统课程设计--在Linux环境下模拟实现简单命令解释器(C++代码)
- elastic-job:参考elastic-console在自己代码中实现任务的失效、生效、终止操作