从零开始的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版的开发博客(已经在做了。。。)

    环境搭建

    众所周知,做iOS开发是一件要么“费钱”,要么“麻烦”的事情,因此我已经默认你已经有了一台Mac或者是你的电脑上装上了黑苹果。

    1、下载Xcode

    推荐从App Store上面直接搜索下载Xcode,毕竟当年的Xcode木马事件依旧历历在目。

    2、创建Xcode项目

    1、打开Xcode,点击Create New Project
    2、选择macOS程序,创建Termianl Application
    3、开始你的Coding

    Objective-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的封装、继承与多态。



  • 哇我也想学Obj-C的,要不交流一波一起哈啤?



  • 当然swift也准备暑假学一波☺



  • @why 吼啊



  • 点赞👍你可以看原来的代码学习应该学习很快



  • 现在有项目学起来效率会很高。我以前刚学OC没多久,项目就没了~~~郁闷惨了



  • 可怕的语法(逃



  • 有没有人对比过Swift和objc开发效率的对比么?
    一个WWDC大会可以从入门到写出flappy bird会不会说明Swift可以更加快速的上手并且具有更高的开发效率。(前提有一定的objc基础)


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

Looks like your connection to Dian was lost, please wait while we try to reconnect.