IOS 静态方法与动态方法详解
IOS 静态方法与动态方法详解
1、问题提出
iOS中有静态方法与动态方法,那么两种方法的异同是什么?
2、问题分析
因为每个对象都由相应的数据结构与方法相构成,一个程序可能有多个属于同一个类的对象,而每个对象的数据结构应该是不一的,但方法是相同的,若为每个对象开辟内存空间来存储方法,必然是对内存空间极大的浪费。因此apple是通过类对象与元类来解决这个问题的。
从根本来说,c++、objective-c、java都发源于c语言,因此这些语言实际上可以理解了经过封装的c语言,所以它们更加方便使用但效率不如c语言。
因此,对象的底层实际上就是结构体,其有两个重要的指针,一个是isa指针,一个是super指针。
isa指针:负责指向类对象,用来表明自己是什么类类型,并能调用类对象中的动态方法。
super指针:表示对象的继承关系,指向父类,从而能调用父类的相应方法。
类对象:类对象是由元类生成的对象,负责存储动态方法,动态方法在编译器是不确定的,因此编译器也无法检测与动态方法相关的错误,动态方法的调用是在运行期中通过消息机制来执行的,因此也只有运行期才会报错。
元类:元类是用来存储静态方法列表的,编译器能检测。
其整体关系如下图所示:
结论
两者的差异包括:(1)方法列表是区分开的,分别存储在类对象与元类中。
(2)动态方法是在运行期中调用,编译器无法检测错误,静态方法是在编译器就确定,编译器能检测错误。
(3)动态方法由对象调用,静态方法由类调用,因为调用方法是通过isa和super指针实现的。因此对象只能调用类对象的方法,而类对像能调用元类的方法。
3、相关代码
(1)静态、动态方法创建对象
大部分类的静态方法与动态方法中都存在相应的方法可以用于创建对象,除了两者的本质差别,两者的结果是无差异的,都是在堆中创建一个对象的内存,并初始化好各种功能指针。 所以更加推荐使用静态方法创建对象,方便编译器检查错误和代码风格更简洁。从以下代码的结果(注释)中可得验证以上结论。
//tset --静态方法与动态方法区别探究 NSString*haha = @"luo1"; //(__NSCFConstantString *) $0 = 0x000dc054 @"luo1" NSString *hehe = [NSStringstringWithFormat:@"luo2"]; //(__NSCFString *) $1 = 0x7904a370 @"luo2" NSString *xixi = [[NSString alloc] initWithFormat:@"luo3"]; //(__NSCFString *) $2 = 0x7904a140 @"luo3"
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关推荐
-
iOS之点击通知栏的通知进入程序的触发事件
点击通知栏的通知进入程序时,会触发App Delegate里的方法,分为以下两种情况: 1.程序未启动(即底部任务栏里没有进程)时: 此种情况下,点击通知栏的通知进入程序,会触发以下方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 对于launchOptions参数,需要经过以下处理: NSDictionary* pushN
-
IOS CoreLocation实现系统自带定位的方法
Core Location是iOS SDK中一个提供设备位置的框架.可以使用三种技术来获取位置:GPS.蜂窝或WiFi.在这些技术中,GPS最为精准,如果有GPS硬件,Core Location将优先使用它.如果设备没有GPS硬件(如WiFi iPad)或使用GPS获取当前位置时失败,Core Location将退而求其次,选择使用蜂窝或WiFi. Core Location的大多数功能是由位置管理器(CLLocationManager)提供的,可以使用位置管理器来指定位置更新的频率和精度,以及
-
iOS开发之App主题切换解决方案完整版(Swift版)
本篇博客就来介绍一下iOS App中主题切换的常规做法,当然本篇博客中只是提到了一种主题切换的方法,当然还有其他方法,在此就不做过多赘述了.本篇博客中所涉及的Demo完全使用Swift3.0编写完成,并使用iOS的NSNotification来触发主题切换的动作.本篇博客我们先对我们的主题系统进行设计,然后给出具体实现方式.当然在我们设计本篇博客所涉及的Demo时,我们要遵循"高内聚,低耦合","面向接口编程","便于维护与扩充"等特点. 本篇博
-
iOS添加购物车动画效果示例
一.计算动画开始结束点位置 方法: - (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view; 1) 动画开始位置fromCenter 复制代码 代码如下: CGPoint fromCenter = [animationView convertPoint:CGPointMake(animationView.frame.size.width * 0.5f, animationView.frame.size.heig
-
IOS React等Title不显示问题解决办法
IOS React等Title不显示问题解决办法 单页应用里整个页面只会在第一次完全刷新,后面只会局部刷新(一般不包括head及里面的title),所以无法在服务器端控制title,只能在页面刷新的时候通过js修改title.常规做法如下,可惜在iOS微信浏览器无效. 问题原因: 因为微信浏览器首次加载页面初始化title后,就再也不监听 document.title的change事件. 解决方案: 修改title之后,给页面加上一个内容为空的iframe,随后立即删除这个iframe,这时候会
-
iOS开发支付宝支付成功返回字符串的处理操作
{ memo=""; result="partner=\"311811\"&seller_id=\"nse@gmail.com\"&out_trade_no=\"S005372\"&subject=\"\U522b\U5885\U8ba2\U5355\"&body=\"\U5885\"&total_fee=\"0.1\"
-
iOS UIScrollView滚动视图/无限循环滚动/自动滚动的实例代码
我们都知道UIScrollView有一种很流畅的切换效果,结合UIPageControl的辅助展示效果,就可以完成一个很不错的产品介绍功能页面.下面给大家分享iOS UIScrollView滚动视图/无限循环滚动/自动滚动功能,具体代码如下所示: <UIScrollViewDelegate> #define WIDTH [[UIScreen mainScreen] bounds].size.width #define HEIGHT [[UIScreen mainScreen] bounds].
-
IOS 静态方法与动态方法详解
IOS 静态方法与动态方法详解 1.问题提出 iOS中有静态方法与动态方法,那么两种方法的异同是什么? 2.问题分析 因为每个对象都由相应的数据结构与方法相构成,一个程序可能有多个属于同一个类的对象,而每个对象的数据结构应该是不一的,但方法是相同的,若为每个对象开辟内存空间来存储方法,必然是对内存空间极大的浪费.因此apple是通过类对象与元类来解决这个问题的. 从根本来说,c++.objective-c.java都发源于c语言,因此这些语言实际上可以理解了经过封装的c语言,所以它们更加方便使用
-
iOS常用的公共方法详解
1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat size = 0.0; NSError *error; NSDictionary *dic = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error]; if (error) { #ifdef DEBUG NSLog(@"error: %
-
vuejs动态组件给子组件传递数据的方法详解
通过子组件定义时候的props可以支持父组件给子组件传递数据,这些定义的props在子组件的标签中使用绑定属性即可,但是如果使用的是<component>动态组件,这个时候就没有显式的子组件标签,要给子组件传递数据需要在<component> 中进行绑定 <div class="app" id="deviceready"> <component :is="currentView" :user_name.s
-
iOS Webview自适应实际内容高度的4种方法详解
//第一种方法 - (void)webViewDidFinishLoad:(UIWebView *)webView { CGFloat webViewHeight=[webView.scrollView contentSize].height; CGRect newFrame = webView.frame; newFrame.size.height = webViewHeight; webView.frame = newFrame; _webTablewView.contentSize = C
-
IOS中Json解析实例方法详解(四种方法)
作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http://www.bejson.com/"网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的iOS版本,可以使用第三方库来解析Json. 本文将介绍Tou
-
JVM 方法调用之动态分派(详解)
1. 动态分派 一个体现是重写(override).下面的代码,运行结果很明显. public class App { public static void main(String[] args) { Super object = new Sub(); object.f(); } } class Super { public void f() { System.out.println("super : f()"); } public void f(int i) { System.out
-
iOS NSURLProtocol的具体使用方法详解
本文介绍了iOS NSURLProtocol的具体使用方法详解,分享给大家,具体如下: NSURLProtocol定义 这两天在优化项目,无意间看到了NSURLProtocol,学习一下顺便总结下来. NSURLProtocol也是苹果众多黑魔法中的一种,能够让你去重新定义苹果的URL加载系统 (URL Loading System)的行为,URL Loading System里有许多类用于处理URL请求,比如NSURL,NSURLRequest,NSURLConnection和NSURLSes
-
对Vue table 动态表格td可编辑的方法详解
项目中需求用到可编辑表格 下图这种 ↓ element UI 组件table表格中 增加template 模版 翻入input 根据业务逻辑增加全局变量 isEdit 是否变化. <el-table-column label="名称" width="140"> <template scope="scope"> <el-input v-if="scope.row.isEdit && scope
-
JavaScript实现生成动态表格和动态效果的方法详解
今天上午完成了Vue实现一个表格的动态样式,那么JavaScript代码能不能实现同样的效果呢?这样也可以学习一下JavaScript的语法,晚上试了一下,完全可以,效果一模一样. <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="X-UA-Compatible" content="text/html; charset=utf-8">
-
Java为实体类动态添加属性的方法详解
目录 添加依赖 代码 测试 可以给已有实体类动态的添加字段并返回新的实体对象,不影响原来的实体对象结构. 添加依赖 <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>commons
随机推荐
- php Calender(日历)代码分享
- Ajax+php实现商品分类三级联动
- DISCUZ论坛的UBB编辑器(增加灵活调用,支持ASP UBB解析)打包下载
- jquery购物车实时结算特效实现思路
- DWR Ext 加载数据
- 用vbscript把 Word 文档保存为文本文件的代码
- iOS开发UI篇—xib的简单使用实例
- 基于Unity容器中的对象生存期管理分析
- 微信公众平台开发关注及取消关注事件的方法
- php实现utf-8转unicode函数分享
- PHP漏洞全解(详细介绍)
- Python函数可变参数定义及其参数传递方式实例详解
- 浅析C# 基础语法的使用
- c#执行excel宏模版的方法
- 使用js 设置url参数
- iOS 配置.gitignore文件详细介绍
- IE9 IE8 ajax跨域问题的快速解决方法
- PowerShell中实现混淆密码示例
- JavaScript 读URL参数增强改进版版
- Nginx配置优化详解