iOS知识梳理 - 关于Objective-C

栏目: Objective-C · 发布时间: 5年前

内容简介:作为早期的面向对象语言,且直到现在仍然为人们所熟知,Objective-C显然有其独到之处。这里对Objective-C的特点进行简单阐述。Objc这个语言具有比较强大的动态特性,常提到的包括动态类型、动态绑定、动态加载。

作为早期的面向对象语言,且直到现在仍然为人们所熟知,Objective-C显然有其独到之处。

这里对Objective-C的特点进行简单阐述。

动态?静态?

Objc这个语言具有比较强大的动态特性,常提到的包括动态类型、动态绑定、动态加载。

动态类型主要指类指针id,其类型是在运行时才能决定的。

动态绑定指一个对象的方法可以在运行时添加、替换。

动态加载指运行时可以动态地创建新的类。

因此我们称Objc是一个动态类型的动态语言。

虽然Objc有着诸多动态特性,但它并不是个像JavaScript、 python 那样典型的动态语言,有的人会说Objc是个“动静结合”的语言。它虽然有动态类型,但是更常用的是静态类型系统;而动态加载、动态绑定更是高级特性而非基本语法。

总的而言,Objc写起来更像静态语言的感觉(

啰嗦

),但它有着丰富的动态特性。

消息传递 vs 函数调用

对象间的通信形式应当是怎样的?

函数调用的方式是指,调用方直接或间接地拿到被调用方的函数地址进行函数调用。

而消息传递是指,调用方只是把方法名和参数等信息传递给被调用方,具体的执行由被调用方处理。

显然,消息机制会更加灵活。

早年的半篇神作 function/bind的救赎(上) 中大佬对消息传递和方法调用的区别做了深刻分析,阐述了消息机制的优点,值得一读。不过作者可能把调用机制看得太重了。

内存管理

内存管理大体上有三类,开发者手动维护、基于引用计数并提供一些机制解决循环引用、自动垃圾收集。

自己手动派主要就是c/c++了,性能最好,缺点是开发者心智负担重。

垃圾回收派是最多的,现在流行的语言大多都是gc的路子,Java/JavaScript/python/golang等等。优点是轻松,缺点是通常情况下gc是阻塞的,触发gc时会有几十ms到数百ms的卡顿。现在也有 并发gc 的技术,不过用得并不广泛,不太了解。

Objc属于基于引用计数并提供一些机制解决循环引用的。我们知道,朴素的引用计数存在的问题是无法识别循环引用。Objc提供了ARC机制,开发者标记对象间的引用是强引用还是弱引用,Objc的runtime来解决剩下的事情。使得内存管理的性能和开发者的负担得到了比较好的平衡。同属这一流派的还有个 Rust的所有权机制

方法定义和方法调用的语法

这个点只是个小细节了,跟上面的不在一个层面,不过这可能是大部分人初学Objc时觉得跟其它语言最大的不同。

Objc的方法声明是这个样子的:

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;

它包含了方法标示符(-)、返回类型(void)、方法名称(insertString:atIndex:)、参数类型和参数名称。注意,每个参数前面那一两个次的描述,是算在函数名里面的。

其实回头看来,这样的语法是有一定优点的。

前两天看一个c++的库,里面有个函数有12个参数,调用的时候就很烦,总担心我填的参数错位了:

demoFunc(var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11,var12)

Objc虽然啰嗦了点,但是看起来其实会比较清晰,比如一个很长的方法:

- (id)initWithBitmapDataPlanes:(unsigned char **)planes 
                    pixelsWide:(NSInteger)width 
                    pixelsHigh:(NSInteger)height 
                 bitsPerSample:(NSInteger)bps 
               samplesPerPixel:(NSInteger)spp 
                      hasAlpha:(BOOL)alpha 
                      isPlanar:(BOOL)isPlanar 
                colorSpaceName:(NSString *)colorSpaceName 
                  bitmapFormat:(NSBitmapFormat)bitmapFormat 
                   bytesPerRow:(NSInteger)rowBytes 
                  bitsPerPixel:(NSInteger)pixelBits;

调用时是这个样子:

NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc]
                            initWithBitmapDataPlanes:(unsigned char **)&data
                            pixelsWide:gWidth
                            pixelsHigh:gHeight
                            bitsPerSample:8
                            samplesPerPixel:3
                            hasAlpha:NO
                            isPlanar:NO
                            colorSpaceName:NSCalibratedRGBColorSpace
                            bytesPerRow:gWidth*3
                            bitsPerPixel:24];

每个参数是啥会比较明确。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机操作系统

计算机操作系统

/ 西安电子科技大学出版 / 1984-11 / 19.60元

一起来看看 《计算机操作系统》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换