从零开始的iOS开发之旅:Objective-C篇(上)
-
从零开始的iOS开发之旅:Objective-C篇(上)
by
张新驿
前言
iOS作为现在看来的两大成功的移动操作系统,其特点如同mac OS一样,优雅,简洁。在开发上,由于其封闭性,所以一般不会出现Android上的一大堆适配问题(虽然现在很有这样的趋势),因此现在看来相较于Android,其开发更加简单。这一系列博客的目的,也是希望对其有兴趣的同志可以和我们一起跳入iOS的大坑之中(手动滑稽)。
为什么要学Objective-C
在Swift出现之前,Objective-C基本上是iOS开发的唯一语言,其惯性是巨大的,在第三方库的支持上,是要较Swift强大许多。而且由于其语言特性,可以相对原生支持C/C++代码,因此现在很多公司依旧沿用ObjC作为iOS前端的开发语言。学习ObjC,也能更让你深层次的理解iOS开发
但是这并不意味着我们不需要学习Swift,对于近几年来说,iOS项目也在不断的加入Swift代码,一部分创业公司也开始使用纯Swift开发iOS项目,对于这一点来说,Swift在未来的应该也会越来越广泛,Swift本身更安全,语法相较于ObjC也更加方便,并且随着Swift的发展,函数式、面向协议的概念也被开发者逐渐的接受。之后有时间也会写Swift版的开发博客(已经在做了。。。)- Swift学习
初学:官方文档,开发指南
进阶:Swift的基本书 - Objective-C学习
初学:官方文档,《Objective-C基础教程》
进阶:《Effective Objective-C》 - iOS开发
参考:trip-to-iOS
环境搭建
众所周知,做iOS开发是一件要么“费钱”,要么“麻烦”的事情,因此我已经默认你已经有了一台Mac或者是你的电脑上装上了黑苹果。
1、下载Xcode
推荐从App Store上面直接搜索下载Xcode,毕竟当年的Xcode木马事件依旧历历在目。
2、创建Xcode项目
1、打开Xcode,点击Create New Project
2、选择macOS程序,创建Termianl Application
3、开始你的CodingObjective-C入门
下面的教程建立在你至少曾使用C/C++进行过开发的基础上,将不在复述其与C/C++的相同语法。
Objective-C 是一种简单的计算机语言,设计为可以支持真正的面向对象编程。Objective-C 通过提供类定义,方法以及属性的语法,还有其他可以提高类的动态扩展能力的结构等,扩展了标准的 ANSI C语言。类的语法和设计主要是基于 Smalltalk,最早的面向对象编程语言之一。
Objective-C:C的超集
Objective-Objective-C是C语言的严格超集--任何C语言程序不经修改就可以直接通过Objective-C编译器,在Objective-C中使用C语言代码也是完全合法的。而C++代码也在之后的版本中可以支持
ObjC代码的扩展名
扩展名 内容类型 .h 头文件。包括类,类型,函数和常量的声明 .m 源代码文件。可以包含Objective-C与C的代码 .mm 源代码文件。处理ObjC与C的代码外,还可包含C++的代码。仅在需要使用C++代码时使用 当你引用头文件时,除了标准的
#inlude
外,Objective-C提供了一种更好的指令#import
,其使用方法同#include
一致,但其可以确保相同的文件仅会被包含一次。因此你的代码也推荐这样使用。我的第一个ObjC程序
#import <Foundation/Foundation.h> int main(int argc, char *argv[]) { @autoreleasepool { NSLog(@"Hello World!"); } return 0; }
Objective-C的面向对象语法源于Smalltalk消息传递风格。所有其他非面向对象的语法,包括变量类型,预处理器(preprocessing),流程控制,函数声明与调用皆与C语言完全一致。但有些C语言语法合法代码在Objective-c中表达的意思不一定相同,比如某些布尔表达式,在C语言中返回值为true,但在Objective-C若与yes直接相比较,函数将会出错,因为在Objective-C中yes的值只表示为1。
Objective-C的面向对象
Objective-C最大的特色是承自Smalltalk的消息传递模型(message passing),此机制与今日C++/Jave等主流风格差异甚大。在ObjC中,与其说对象互相调用方法,不如说对象之间互相传递消息更为精确。
如在C#中调用一个对象的方法语法如下obj.method(argument);
在ObjC中则如下
[obj method:argument];
看似仅仅是语法的区别,但其基本行为上则有着本质不同。
以一个Dog
类的对象调用Bark
方法为例子
C#
Dog.Bark();
Objective-C
[Dog Bark];
典型的C#意义解读是"调用Dog类别的Bark方法"。若Dog类别里头没有定义Bark方法,那编译肯定不会通过。但是Objective-C里,我们应当解读为"发提交一个Bark的消息给Dog对象",Bark是消息,而Dog是消息的接收者。Dog收到消息后会决定如何回应这个消息,若Dog类别内定义有Bark方法就运行方法内之代码,若Dog内不存在Bark方法,则程序依旧可以通过编译,运行期则抛出异常。
此二种风格各有优劣。C#强制要求所有的方法都必须有对应的动作,且编译期绑定使得函数调用非常快速。缺点是仅有有限的动态绑定能力。Objective-C天生即具备鸭子类型之动态绑定能力,因为运行期才处理消息,允许发送未知消息给对象。可以送消息给整个对象集合而不需要一一检查每个对象的类型,也具备消息转送机制。同时空对象nil接受消息后默认为不做事,所以送消息给nil也不用担心程序崩溃。
总结
本期的博客主要是介绍ObjC的一些语言特点,让读者对于其有一定的印象,所以代码部分较少,下一期将着重讲述Objective-C的封装、继承与多态。
- Swift学习
-
哇我也想学Obj-C的,要不交流一波一起哈啤?
-
当然swift也准备暑假学一波
-
@why 吼啊
-
点赞你可以看原来的代码学习应该学习很快
-
现在有项目学起来效率会很高。我以前刚学OC没多久,项目就没了~~~郁闷惨了
-
可怕的语法(逃
-
有没有人对比过Swift和objc开发效率的对比么?
一个WWDC大会可以从入门到写出flappy bird会不会说明Swift可以更加快速的上手并且具有更高的开发效率。(前提有一定的objc基础)