您好,欢迎访问本站博客!登录后台查看权限
  • 欢迎大神光临
  • 有朋自远方来 不亦悦乎

Objective-C教程之你好世界

ObjC教程 老刘 2018-08-01 308 次浏览 0个评论

演示如何使用Xcode和命令行练习Objective-C,分析一个简单的Objective-C程序。

获取例子源码

概述

Objective-C是在C语言基础上添加面向对象等特性而成的一门多用途语言,这意味着可以直接在Objective-C上书写和调用C语言, 实际上还可以和C++混写在同一个源文件中(Objective-C++)。

Objective-C主要用于苹果产品比如iOS、macOS的软件开发,相对于其他语言来说,应用范围比较狭隘,而Swift也有取代她的趋势, 但是她依然有顽强的生命力,很多公司依然以Objective-C为主力或者完全使用Objective-C,也就是我们依然能靠她找到工作, 这是很重要的。Swift对于初学者或者Java、C#等现代语言程序员比较容易入手,但是对于熟悉 C、C++的程序员来说,入手Objective-C会事半功倍。Swift可以直接调用Objective-C的代码,而Swift除 非刻意给Objective-C提供接口,否则是不能直接调用的。反正各种原因,从事苹果产品软件开发,即使2018,以及未来几年,依然有 学习Objective-C的必要。

Xcode建立macOS命令行项目

马上着手写第一个Objective-C程序!首先我们可以在macOS的应用商店下载Xcode软件,然后为了将学习精力集中于语言本身,我们可以用Xcode建立 macOS命令行项目,用于Objective-C语言的练习。

建立项目步骤:

a. 打开Xcode,菜单File->New->Project...打开选模板界面,选择macOS->Command Line Tool

选择模板

b. 接着填写项目信息,填写项目名称HelloWorld,选择语言Objective-C,对于命令行工具来说,其他信息不是很重要,可以随意填写。

填写项目信息

c. 接着选择项目保存路径。

填写项目信息

d. 最后完成创建。

完成创建

默认她会帮我们添加一个main.m文件,并且写了一个简单入口函数模板。这个main.m的内容如下

//
//  main.m
//  HelloWorld
//
//  Created by 码叔 on 2018/8/29.
//  Copyright © 2018年 码叔. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}

可以通过Xcode菜单Product->Run编译运行该程序,或者点击左上角的三角按钮编译运行该程序, 会在Xcode下方控制台All Output窗口看到程序的输出。

2018-08-29 10:03:49.488970+0800 HelloWorld[820:19533] Hello, World!
Program ended with exit code: 0

命令行开发步骤

Linux下的GCC和G++或者其他命令行编译代码方式,同样适用于Objective-C 的程序开发,而且macOS和Linux的命令是一样的,可以在启动台->其他->终端找到终端程序 。我们可以发现终端程序输入的Linux的的大部分命令都可以运行,比如ls、mkdir、gcc、make等等,这对于熟悉Linux的人来说, 是个激动人心的事情。

编辑文件

下面这个例子只需要一个.m文件。使用vim(终端已经自带该命令)或者其他任何文本编辑器建立一个文件main.m;

main.m

// main.m
// 我的第一个Objective-C程序
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}

利用命令行编译运行

在Mac终端下可以用clang或者gcc(实际是clang的别名)命令进行编译。

编译

clang main.m -fobjc-arc -o main

运行

./main

输出

2018-08-01 17:37:35.138 main[4470:137419] Hello, World!

理解程序

Objective-C是一门C超语言,所以C语言的语法完全能用,学习Objective-C其实就是学习Objective-C在C之上扩展的新特性。

程序文件后缀

  • .m 文件用于存储Objective-C源码,可以和C语言混写;
  • .h 头文件。
  • .mm 用于混写C++和Objective-C的源码,一般叫Objective-C++。

注释

注释和C语言是一样。

  • // 注释内容 单行注释
  • /* 注释内容 */ 多行注释

#import

#import <Foundation/Foundation.h>

像上面这行是Objective-C特有的预处理命令。

在Objective-C中,使用#import预处理命令包含头文件, 可以自动防止重复包含。当包含C语言风格(头文件中已经有防重复包含处理)的头文件时可以用#include, 也可以用#import,但是建议编写Objective-C代码始终用#import代替#include。

Foundation框架

Foundation是Objective-C最基本的框架,就像C语言的标准库一样。Foundation.h包含了该框架的所有头文件。

Foundation.h部分内容

/*  Foundation.h
    Copyright (c) 1994-2017, Apple Inc. All rights reserved.
*/


#include <CoreFoundation/CoreFoundation.h>

#import <Foundation/NSObjCRuntime.h>

#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSBundle.h>
#import <Foundation/NSByteOrder.h>
#import <Foundation/NSCalendar.h>
#import <Foundation/NSCharacterSet.h>
#import <Foundation/NSCoder.h>
#import <Foundation/NSData.h>
#import <Foundation/NSDate.h>
#import <Foundation/NSDateInterval.h>
#import <Foundation/NSDateFormatter.h>
#import <Foundation/NSDateIntervalFormatter.h>

入口函数

和C一样,以main为入口函数。

@autoreleasepool

顾名思义,被@autoreleasepool包裹的代码块,Objective-C将自动释放在其中创建Objective-C对象的内存,注意是 Objective-C对象,如果是C语言malloc出来的内存,依然要我们手动释放。

NSLog@""还有%@

我们依然可以使用C语言的printf等函数打印字符串,但是Foundation框架为我们提供专门的打印日志函数,也就是NSLog, 她将附加打印时间戳等信息,还将自动换行。

NSLog第一个参数(格式化字符串)需要Objective-C字符串对象,而不是C语言字符串(C语言字符串实际上是char数组), 需要添加一个@在双引号前面,这是Objective-C语法对Objective-C字符串字面量的规定,以和C语言的字符串区分开来。

@符号在Objective-C的多个语法中出现,Objective-C对象字面量(字符串字面量、字典字面量、数组字面量)和关键字( @autoreleasepool@import...)一般都会以@开头。

NSLog支持格式化输出,比如

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int i = 0;
        char * c_str = "Some C String...";
        NSString *str = @"Some NSString...";
        NSLog(@"i=%d, c_str=%s, str=%@", i, c_str, str);
    }
    return 0;
}

运行该程序将输出

2018-09-03 11:34:31.196643+0800 NSLog[1392:50555] i=0, c_str=Some C String..., str=Some NSString...

%d,%s都是C语言的格式化符号了,NSLog兼容其它所有的C语言格式化符号,另外添加了%@格式化符号,%@专门用于输出 Objective-C对象,比如NSString对象。

已有 308 位网友参与,快来吐槽:

发表评论