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非常合适。但是引用计数维护成本略高,而且容易出错,引用计数过多,造成内存泄露,过少,出现野指针,对于经验少的程序员,很难做到平衡,需要熟悉这套机制,并且熟悉对应的API。所以高级的编译器支持自动引用计数,将引用计数的工作交给编译器,编译器通过检测针对引用计数进行控制,但是它也有自己的规则,以后的帖子会讲到。

今天就讲到这个里,多谢观看。

今天的要点:

OC是C得超级,增加了面向对象性,OC使用动态绑定的消息结构,只有运行时才能知道对象的类型,以及需要执行的代码,不由编译器决定。

理解堆内存存放的是什么,栈内存存放的什么。

时间: 2024-08-06 11:49:35

IOS强化知识(1)认识Objective-C的相关文章

Qt for iOS,Qt 与Objective C混合编程

项目设置 既然要聊 Qt 混合 OC 编程,首先要简单介绍一下 Objective C .我只有一句话:Go,问搜索引擎去.因为我所知实在有限,怕误导了您.当然如果您不怕,往下看吧. OC源文件介绍 首先我要说一下 Objective C 的源文件,后缀是.m 或 .mm ,在 .mm 文件里,可以直接使用 C++ 代码.所以,我们要混合 Qt 代码与 OC 代码,就需要在 Qt 项目里加入 mm 文件. pro 文件配置 Qt SDK for Mac ,安装之后, Qt Creator 会使用

iOS开发核心语言Objective C —— 全部知识点总结

本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基础.建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在開始Objective C语言的学习,假设您遇到问题也能够与我探讨.另外将无偿分享自己整理出来的大概400G iOS学习视频及学习资料,都是干货哦.能够新浪微博私信?关注极客James,期待与您的共同学习和探讨! ! 由于时间有限,每

iOS开发核心语言Objective C —— 面向对象思维、setter和getter方法及点语法

本分享是面向有意向从事iOS开发的伙伴们.或者已经从事了iOS的开发人员.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列.然后在開始Objective C语言的学习,假设您遇到问题也能够与我探讨,另外将无偿分享自己整理的大概400G iOS学习视频及学习资料.都是干货哦.能够新浪微博私信?关注极客James.期待与您的共同学习和探讨.! 由于时间有限,每天在工作之余整理的学习分享.难免有不足之

IOS-Swift、Objective-C、C++混合编程

1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的,所以如果需要在Objective-C调用C++语言就需要直接将后缀m文件改为mm,然后就可以调用C++代码了. Objective-C兼容C,Objective-C++兼容C.C++. 接下来是在OC工程中创建C++文件,并调用C++的代码: 然后在OC文件中直接用C++的语法调用C++,所以前提是

iOS开发核心语言Objective C —— 所有知识点总结

C和OC对比 OC中主要开发在什么平台上的应用程序?答:可以使用OC开发Mac OS X平台和iOS平台的应用程序 OC中新增关键字大部分是以什么开头?答:OC中新增关键字大部分是以@开头 OC中新增加了那些数据类型?答:Block类型指针类型(Class, id类型)空类型特殊类型(SEL, nil) 面向对象特性是什么?答:继承性,封装性,多态性 import和#include有什么区别? 答:import 的功能和 include一样, 是将右边的文件拷贝到当前import的位置.为了降低

IOS学习笔记3—Objective C—简单的内存管理

今天简述一下简单的内存管理,在IOS5.0以后Apple增加了ARC机制(Automatic Reference Counting),给开发人员带来了不少的方便,但是为了能更好的理解IOS内存管理机制,还是需要对其比较了解. 1.在OC中,每个对象都有一个保留计数,创建时每个对象都有一个初始值为1的保留计数,释放时,保留计数都为0 2.创建自动释放的对象 要求以一个方法创建对象时,以自动释放的形式返回该对象是一个很好的编程实践 +(Car *)car { Car *myCar = [[Car a

IOS强化知识(2)@class的运用

1.为什么使用@class 与C++语言一样,OC也需要一个头文件(h文件),一个实现文件(m文件).当你引用其他类的时候,你就需要引入头文件.虽然引用头文件没有任何问题,但是如果你不想知道这个类的细节,只想知道它仅仅是个类的话,引用头文件可能显得多余,而且会增加编译的时间.用@class的话,你可以不引入任何头文件,就能让编译器知道某个它是一个类.例如: @class B; @interface A:NSObject @property B* b; @end; 极端情况讲,如果有成千上万个类都

iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象

1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较.这一篇文章,我准备为大家介绍一下奇葩的Objective-C语言的语法和使用.这篇文章主要讲Objective-C的理论概念. 2.学习目标 2.1 Objective-C语言面向对象的特性与其他语言(C++)类比学习,声明定义一个MyObject类,并创建这个类的实例. 2.2 Objectiv

iOS runtime整理

iOS利用Runtime自定义控制器POP手势动画 http://www.cocoachina.com/ios/20150401/11459.html Objective C运行时(runtime)技术总结,好强大的runtime http://www.cnblogs.com/yswdarren/p/3619303.html IOS高级开发-Runtime(一) http://blog.csdn.net/lizhongfu2013/article/details/9496705 iOS运行时ru