关于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中大部分关键字以@开头的

时间: 2024-10-11 13:24:33

关于C、OC、C++、OC++、Swift的一些常识的相关文章

swiftDay01笔记 --swift和OC的不同点 && swift的基础语法

1.创建对象 带圆括号 * OC:      alloc initWithXXX 方法 * Swift:   (xxx:) //OC : //UIView *view = [UIView alloc]init]; //Swift : let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 2.方法调用   用点 * OC:     [UIColor redColor]; * Swift    UIColor.re

iOS 中 OC项目使用swift第三方工具(OC、swift 混合)

OC项目引入swift, 1.建立 bridge 文件:在OC工程中新建swift文件,确认创建时,会提示建立 一个 项目名-bridging-header.h 文件. 2,建立 bridge 文件之后,在其中引入要用的 文件名  import 例如使用Charts 时: @import Charts; Charts : 各种统计图形(饼状图.折线图.柱状图等等)工具,流畅好用,效果给力. 3,在工程中需要用到第三方的时候,引入该 bridge 文件即可:

记OC迁移至swift中笔记20tips

写久了OC后来写swift,总感觉写着是swift的皮毛,但是实际上是OC的核心,这里整理了OC迁移至swift中的一些小细节. 1 在当前类中,实例方法调用属性以及方法都可以将self省略掉,而且是建议省略 2 selector是调用方法写法是:Selector("sayHello")或者是#selector(sayHello) 3 swift中不同类型的值之间不能直接做运算,所以不同类型值做运算的时候需要对值进行类型转化,都转化至同一类型之后方可做运算 4 可选类型如果一个变量可能

UIWebView开发中,js与oc,js与swift交互,相互传递参数的方法

实际开发中经常遇到需要向webView传递参数或从webView取参数,在此写了个超简单的demo供大家参考,本人js刚学了一天,所以不足之处海涵. 废话不多说,直接上代码 oc版 1 #import "ViewController.h" 2 @interface ViewController ()<UIWebViewDelegate> 3 @property (nonatomic, strong)UIWebView * webView; 4 @end 5 6 @imple

iOS开发——混编Swift篇&amp;OC移植为swift

将Ojective-C代码移植转换为Swift代码 2015-03-09 15:07发布:yuhang浏览:201 相比于Objective-C,Swift语言更加简练.有时我们需要把原来写的一些Objective-C代码转换成Swift,下面总结了各种常见的情况. 1,构造函数的迁移 Objective-C为: 1 HanggeMenuItem *starMenuItem1 = [[HanggeMenuItem alloc] initWithImage:storyMenuItemImage 2

core image几个滤镜样例 oc版本号和swift版本号

oc版本号 //万花筒模式 + (CGImageRef) getKaleidoscope:(CIContext *)context { CIImage * image = [CIImage imageWithCGImage:[UIImage imageNamed:@"Icon"].CGImage]; CIFilter * kaleidoscope = [CIFilter filterWithName:@"CIKaleidoscope"]; [kaleidoscope

OC工程调用Swift方法

1.建一个OC工程命名为SwiftOC.如图所示: 2.新建一个swfit文件命名为Test.swift,会弹出提示,选择Create Bridging Header建立桥接文件,系统会建立“工程名-Bridging-Header.h”,如图所示: 3.配置工程设置Defines Module 为Yes 设置Product Module Name 为当前工程名 此时系统会为工程创建一个“工程名-Swift.h”的文件,此文件不可手动创建,必须使用系统创建的. 4.创建一个Test2.swift

Swift基础之OC文件调用Swift代码(在上次的基础上写的)

前两天刚写过Swift调用OC,今天在原来的基础上,实现OC调用Swift. 首先,创建一个OneSwiftFile.swift文件,创建一个继承于NSObject的类(这个地方你可以自己选择继承的父类) 然后在类中创建几个方法,方便在OC文件中使用 class OneSwiftFile:NSObject{    override init() {        NSLog("这是在init方法中...");    }        //创建一个方法    func someFunc(

OC - 3.OC的三大特性

一.封装 1> 封装的定义 隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别 2> 封装的好处 可以通过set方法防止为成员变量设置不合理的值 仅向外部提供公开的接口,屏蔽成员变量的操作过程 外界可以通过接口间接的操作成员变量,而不必关注内部细节 3> set方法和get方法 set方法 ① 作用:为成员变量赋值 ② 命名规范 1)名字必须以set开头 2)set后紧跟成员变量名,且首字母要大写 3)返回值一定是void类型 4)一定接收一个类型与要赋值的成