IOS加强知识(1)理解力Objective-C
一直想写一般Objective-C帖子,总是没时间。所以,我希望有一个巨大的知识更小。温馨提示小的变化。写一点点,每天。东西把他们的学习分享,好了废话不多。
1、一门动态的语言OC
Object-C(下面简称OC)是一门面向对象语言,这恐怕学过编程的人都知道。可是OC跟其它语言相比,显得格格不入。
由于它是一门消息结构语言,而非函数调用。所以语法上显得非常怪,一般是这样:
[对象消息];
可是消息型语言有一个优点。就是它的动态性。其执行时所执行的代码都是动态的,依据当时执行环境决定。而函数式语言,所执行的代码编译阶段就已经确定。
函数式语言编译的时候须要查询函数表才干知道究竟执行那段代码。
而消息式语言,编译时期无需知道该执行哪段代码,由于它总是到执行的时候,才会去找。
它甚至不须要知道消息对象的类型。而这一个过程称之为“动态绑定”。
所以OC的执行时不同于其它语言,OC重要的工作都在“执行期组件”中完毕。OC的全部特性以及内存管理都在“执行期组件”完毕,“执行期组件”本质是动态库。而代码能把开发人员所写的全部代码组合起来。这种话,仅仅须要更新“执行期组件”就能提高程序性能,而那些函数式语言就须要又一次编译。
2、“堆内存”和“栈内存”
与C++不同。OC不同意将OC对象的内存分配到栈(stack)上。仅仅能分配到堆(heap)上。
C++ string str = "123"; 合法
OC NSString str = @"123";非法
OC必须用一个指针指向一个OC对象。如:
NSString* str = @"123";合法
而大家都知道指针的内存分配到栈上 。
所以比如:
NSString* str2 = str;
这不过进行一次指针的拷贝。并没有分配新的空间。
用一张图来描写叙述就是这样:
分配在栈上的内存。系统自己主动清理。
而分配到堆上的内存由程序猿来清理。而OC本身实现了引用计数模式管理内存。
但有时候,你会发现有些变量定义不含“ * ”。
那么他们可能会分配在栈上。
(id除外。由于它本身已经是指针)
OC是C得超集,全然兼容C所以基本类型和结构体是同意分配到栈上的,比方:
NSInteger CGFloat CGRect CGPoint int double BOOL 等等。
创建结构的开销远远小于对象。
假设你对C语言不是太熟悉。那么你得努力了。
3、引用计数与自己主动引用计数(ARC)
引用计数是内存管理的一种策略。简言之,每个对象须要维护一个整数,这个整数记录了该对象被引用的次数,假设有新的引用(指针的拷贝)指向该对象,那么引用计数+1,当失去一个引用的指向时,引用-1。当没有不论什么引用指向该对象时,对象被销毁。
由于OC仅仅同意对象分配到堆上,所以引用计数对于OC非常合适。可是引用计数维护成本略高,并且easy出错,引用计数过多,造成内存泄露。过少。出现野指针,对于经验少的程序猿,非常难做到平衡。须要熟悉这套机制,并且熟悉相应的API。所以高级的编译器支持自己主动引用计数,将引用计数的工作交给编译器,编译器通过检測针对引用计数进行控制。可是它也有自己的规则。以后的帖子会讲到。
今天就说到这个里,多谢观看。
今天的要点:
OC是C得超级。添加了面向对象性。OC使用动态绑定的消息结构,仅仅有执行时才干知道对象的类型。以及须要执行的代码。不由编译器决定。
理解什么是存储在堆内存,什么堆栈存储器。
版权声明:本文博主原创文章。博客,未经同意不得转载。
最新文章
- PHP 的 foreach
- 编写简单的ramdisk(选择IO调度器)
- C++链表
- MySQL 主键范围查找问题
- 【leetcode】Two Sum (easy)
- MySQL 表与字段编码格式报错
- WCF学习之二
- Visual Studio 调试技巧 (三) -- 调试第三方组件代码
- mac下使用自带的apache与php
- Web Services的相关名词解释:WSDL与SOAP
- J2SE知识点摘记(二十一)
- WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
- Laravel默认使用utf8_unicode_ci 即使数据库是utf8_general_ci
- Struts2 2.5.12的问题
- vue.js使用webpack发布,部署到服务器上之后在浏览器中可以查看到vue文件源码
- Python爬虫技术(从网页获取图片)+HierarchicalClustering层次聚类算法,实现自动从网页获取图片然后根据图片色调自动分类—Jason niu
- Android 开发 8.0版本启动Service的方法
- web----框架基础
- Spark学习笔记——安装和WordCount
- ubuntu启动进程笔记
热门文章
- Android应用开发学习笔记之绘图
- go (break goto continue)
- 使用GDI+绘制的360风格按钮控件(使用CN_DRAWITEM消息重绘,并使用TGPGraphics,TGPPen,TGPImage,TGPBitmap等)good
- Java编码浅析(注意区分三个概念)(转)
- KMP(Knuth-Morris-Pratt)算法
- HDU 2112 HDU Today(Dijkstra)
- C++primer原书中的一个错误(派生类using声明对基类权限的影响)
- Android开发者必须深入学习的10个应用开源项目
- Android开发之模板模式初探
- UVa 11988 - Broken Keyboard (a.k.a. Beiju Text) 题解