关于C、OC、C++、OC++、Swift的一些常识
关于C、OC、C++、OC++、Swift的一些常识
OC是C语言的一个超集,是一门面向对象的语言,因为苹果的崛起而火,API主要是cocoa(OSX)和cocoatouch(iOS),GCC 和 Clang 都能编译OC,现在xcode使用的是Clang。
OC的实现是建立在运行时机制(runtime system)之上的(runtime system 使用C写的),这使它与C++的编译机制有很大区别。 简单来说就是OC代码执行的时候需要结合runtime library,实现它的功能。正是因为如此,我们调用runtime的一些接口,动态地给OC的类添加方法,成员变量,交换两个方法。这些是在C++无法实现的,C++的代码执行,在编译的时候就已经决定了。
OC的内存管理,在OC没有像java那样的GC机制,它使用的是引用计数机制。下面细说:
OC中定义一个对象: someClass *object = [[someClass alloc] init] ;
someClass *otherObject = object;
上面的代码表示在堆(heap)里面申请了一块内存地址,用于存储someClass的一个对象,然后在当前栈里面分配2个指针的内存大小,用来存储两个指向someClass内存地址的变量。栈里面分配的内存,随着栈被pop,内存自动释放,而heap里面,则是使用引用计数机制来管理,这种功能也是由runtime提供的。 具体来说就是当有一个指针变量指向someClass对象在heap里面的地址时,这个对象的count就是1,上面代码中count就是2. 当这个对象的count变成0时,这个对象在堆中的内存就要被释放了。
在OC中,实例对象只能存储在堆中,像下面这种在栈中为对象分配内存,是不行的:someClass objec = [[someClass alloc] init] ; 马上就会有interface type cannot be statically allocated 的错误。
OC的引用计数机制分为手动引用计数(MRC)和自动引用技术(ARC),后者在2011年推出的,编译器在编译的时候自动的在代码中添加retain和release,前者需要开发者自己添加,相当麻烦,一不留神,内存泄漏。
OC中所有的类都是继承自NSObject,而且只能是单一继承,而不能像C++那样能多重继承,这相对少了一些灵活性,但是OC提供了协议(protocol)弥补了这一缺陷。最近发布的swift,号称面向协议的编程,更是把协议发挥到淋漓尽致(具体可以观看wwdc视频https://developer.apple.com/videos/play/wwdc2015-408/)面向接口编程,而不是面向实现编程,一直是我们追求的。
因为OC与C的关联,可以OC中,无缝使用C语法,OC还可以与C++组合成objective-c++,只需要把OC的.m文件改成.mm,编译器马上就可以识别为Objective-C++ source,所以可以在OC中使用C++的一些库,极大方便开发。另外OC还可以和新退出来的Swift语言混合编写。
OC和C语言比较
说明:比较记忆相对来说更容易熟练记得牢固,理解了C语言相对来说OC也不太难,OC是C语言的扩展,向下兼容C语言。
源文件后缀名比较
1.C语言源文件
.h:头文件
.c:源文件
.o:目标文件
.out :可执行文件
2.OC语言源文件
.h:头文件
.m:源文件
.mm:OC++源文件
数据类型比较
C语言中的常用类型:
OC中的常用类型
注意:OC中新增类型
关键字比较
注意:
1.OC兼容C语言,C语言的关键字都可以在OC中使用
2.如果使用OC中的关键字,部分关键字需要以"@"开头
补充一点:"@"的基本用法
1.表示将C的字符串转换OC中的字符串对象NSstring
2.OC中大部分关键字以@开头的
关于C、OC、C++、OC++、Swift的一些常识的更多相关文章
- 记OC迁移至swift中笔记20tips
写久了OC后来写swift,总感觉写着是swift的皮毛,但是实际上是OC的核心,这里整理了OC迁移至swift中的一些小细节. 1 在当前类中,实例方法调用属性以及方法都可以将self省略掉,而且是 ...
- iOS OC中桥接swift第三方库
swift中有一些比较好的框架,比如绘图框架charts,最近项目中刚好用到,通过Pod的方式直接导入,xcode会自动生成charts-swift.h的文件,然后在需要导入的地方import < ...
- iOS开发——混编Swift篇&OC移植为swift
将Ojective-C代码移植转换为Swift代码 2015-03-09 15:07发布:yuhang浏览:201 相比于Objective-C,Swift语言更加简练.有时我们需要把原来写的一些 ...
- 在OC中调用Swift类中定义delegate出现:Property 'delegate' not found on object of type ...
找了许久没找到答案, 在下面的链接中, 我解决了这个问题: http://stackoverflow.com/questions/26366082/cannot-access-property-of- ...
- OC工程调用Swift方法
1.建一个OC工程命名为SwiftOC.如图所示: 2.新建一个swfit文件命名为Test.swift,会弹出提示,选择Create Bridging Header建立桥接文件,系统会建立“工程名- ...
- Swift基础之OC文件调用Swift代码(在上次的基础上写的)
前两天刚写过Swift调用OC,今天在原来的基础上,实现OC调用Swift. 首先,创建一个OneSwiftFile.swift文件,创建一个继承于NSObject的类(这个地方你可以自己选择继承的父 ...
- 在 OC 中调用 Swift 代码
1.在 Objective-C 项目中使用 Swift 代码 1)在 OC 项目中创建 .Swift 文件,文件中的格式为其本有的格式. 2)Xcode 提示是否创建 Objective-C brid ...
- Moving Swiftly(从OC切换到Swift)
Moving Swiftlyhtml, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0 ...
- 前言-关于学习OC还是学习Swift的个人理解
一直在考虑一个问题!到底是学swift好呢还是学OC好. 然后得到了解答: 1.如果你只是对苹果系统软件开发有兴趣,把开发作为一种业务爱好,那么选swift就没错,swift也是大势所趋. 2.如果你 ...
随机推荐
- dtd语法之定义元素
1.语法:<!ELEMENT 元素名 使用规则> 使用规则: l (#PCDATA) :表示内容为普通文本数据 l EMPTY :表示元素内容必须为空 l ANY :元素出现任意次,一般用 ...
- 矢量图标转成16*16大小的SVG格式
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:一一链接:http://www.zhihu.com/question/32233782/answer/68629385来源:知 ...
- 数据库发出sql命令mysql教程
$db = mysql教程_connect("localhost", "phpdb", "phpdb");mysql_select_db(& ...
- Java下利用Jackson进行JSON解析和序列化
Java下利用Jackson进行JSON解析和序列化 Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行 ...
- Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍
引用自 :http://www.2cto.com/database/201307/224836.html Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍 先假设有这么一个表 ...
- github上有android开源项目
下面是一些比较好的开源项目,总共分为5大类,也许对某一些人有用,有些项目也许将来某一天对自己也有用,所以整理到此,希望对大家有帮助.首先声明非原创,这篇blog的目的是分享给那些可能需要的人. htt ...
- Go项目的目录结构说明
一.项目目录结构 GoPath /bin /pkg /src project_1 project_2 ...... project_n GoPath : 相当于donet下 ...
- php获取某年某月的天数 【转】
function days_in_month($month, $year) { // calculate number of days in a month return $month == 2 ? ...
- 奥迪--Q3
-型号:Q3 -价格:23-35W -动力:1.4T/2.0T -变速箱:6挡双离合/7挡双离合 -长宽高:4.40,1.84,1.59 -油箱:64L -发动机:EA888 -大灯:氙气(选装LED ...
- Rails--content_for和yield
--使用: (1)layout中使用<%=yield(:js)%> (2)html中使用<% content_for :js do %>[XXX]<% end %>