iOS知识梳理 - 关于Objective-C

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

内容简介:作为早期的面向对象语言,且直到现在仍然为人们所熟知,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];

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


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

查看所有标签

猜你喜欢:

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

Programming in Haskell

Programming in Haskell

Graham Hutton / Cambridge University Press / 2007-1-18 / GBP 34.99

Haskell is one of the leading languages for teaching functional programming, enabling students to write simpler and cleaner code, and to learn how to structure and reason about programs. This introduc......一起来看看 《Programming in Haskell》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具