我的OC学习基础课程
什么也不说了, 先来一段oc版的Hello World.
//
// main.m
// xiaomin
//
// Created by xiao min on 2018/6/1.
// Copyright © 2018年 xiao min. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
- 文件是
main.m
. 其实可以把.m
翻译成.message. 就好比c语言的.c
一样. - 文件创建时间, 项目发起人一目了然
#import
就像c语言的#include
一样, 但是经过日积月累, 肯定没表面那么简单, 优化了重复倒入的一些问题, 记得在c语言里用#ifdef #ifndef
等等来预防重复倒入. 这条语句就是导入头文件, 头文件里面包含了许多宏定义, 函数原型, 符号常量, 还有结构体
.我们都知道Objective-C本来就是在C语言基础上建立起来的, 扩展了许许多多功能. import导入了Foundation框架目录下的Foundation.h头文件.- 接下来看到main()函数, 学过c语言的一定觉得很熟悉, 毕竟是C语言的扩展.
- main函数里有个陌生的
@autoreleasepool{}
. 这个陌生吧, 这个玩意儿是日积月累优化下来以后出现的自动释放功能, 以后详解吧. NSLog(@"Hello, World!")
. 和C语言里的printf(“Hello, World!”)类似. NSLog是OC里特有的日志输出函数. 细心的你一定发现里面有个@
.你丫的增加的东西不少, 这玩意儿可以把常量"Hello, World!"
转换成OC中的对象
.return 0;
别逗了, c语言的潜规则, 返回0嘛.
框架
刚才我们说Foundation框架, 框架是什么呢? 我的理解框架就是一个过去的开发者做好的东东, 现在把它们都打包好, 归类(方便找嘛).然后给我们使用, 里面包含许多神秘的魔法. 比如我们使用的AVFoundation音视频播放类. 我说的颗粒度比较小, 可以这样去想, 从地球到人,框架也是一样, 先是苹果公司为我们准备的Xcode这个工具, 然后又分几类, UI界面, 语法结构, 编译器,然后在此基础上在分类, 语言以Objective-c为基础又分几类. 就像树型结构, 不停的开枝散叶, 感觉像一座大山, 其实你认真去学习, 一天学习一点点, 迟早能啃掉这种大山.(不要气馁). 以后还有其他许许多多语言要学习, 这些只是沧海一粟, 一门精深以后, 学习其它的肯定能触类旁通. 言归正传. 我们刚才看到的Foundation框架
是在用户界面之下的那些层的特性, 比如数据结构和通信机制. 可以理解成, 做包子之前, 你的材料面粉还没磨, 你也不知道拿什么去磨面粉, 我也不知道. 哈哈.突然发现前人给我们留了一个仓库. 里面许许多多工具种子, 还有说明书, 只要我们看懂说明书就知道怎么做了. 你懂得, 仓库很大, 里面东西比较多. Foundation框架也一样, 经过了这么多年, 里面什么工具都有, Foundation还只是头文件, 头文件里面放了其它许多头文件, 其它头文件又放了另外的其它头文件. 怎么就跟人一样开枝散叶. 密密麻麻. 还好. 前人给我们归类好了.不要觉得难, 多用(多码)就都会了, 很多都能触类旁通, 相信我, 喜欢你就上, 不要像找女朋友一样扭扭咧咧, 一次不行两次, 两次不行4次. 别让你的大脑懒惰机制起作用.Foundation框架这么大, 也许你会担心加载(导入)的时候会很慢, 前人早就为我们解决了这个问题. 它使用预编译头文件(一种经过压缩,摘要的头文件, 比如:你一打老爸电话, 老爸来了, 怎么在漫漫人海中找到的, 没错, 摘要)来加快速度. 如果想看框架内包含些什么玩意儿, 你点开慢慢看, 听说可以写本书. (看就好了, 别改动)
NSLog和@”字符串”
NSLog
和C语言里的printf
类似. 输出一个字符串, 而且可以在字符串内夹几个格式说明符. 然后在NSLog
的第二个参数开始就能放入许多变量来替换格式说明符来. 对了,NSLog
哪里来的, 当然是前面#import
导入的Foundation
框架里的, 你不导入(#import左肩括号Foundation/Foundation.h>)试试.NSLog
立马不提示了. 当然, NSLog
的作用挺大的, 它会输出时间戳, 运行完毕在后面输出\n
换行. 发现没有, Log是日志的意思, 为什么前面多个NS呢 . 肯定是有用的, 但凡你发现苹果公司给你整点莫民奇妙的东西, 相信我, 它不是吃饱了撑着. 肯定有大用. NS前缀是为了避免冲突. 想象一下几十号人一起开发的时候, 大家如果不加前缀, 在受过同等教育的情况下会不会都用一个名字来命名某些变量或者函数名. 接下来我们说字符串, 为什么多个@呢, 不是吃饱了撑着, @可以转换一些常量变成对象. 转换的过程我也还没学过. @”字符串”是什么对象呢, 当然是字符串对象了. 苹果公司取了个好听的类名:NSString
.还有很多其它的类, 比如数组NSArray
,不同方式设置时间NSDateFormatter
,多线程工具NSThread
,能够让你听到语音的NSSpeechSynthesizer
.
布尔类型
C语言里我们见过bool类型(ture,false). 在OC里面也有BOOL. 这两种类型可以出现在同一个程序里, 但是如果用Cocoa来编写的话只能使用BOOL. 在OC里, BOOL
是一种使用8位二进制表示的内存. 通过#define YES 1
.这样做好处很多, 坏处也有, 如果一个大于1字节的整形值赋给一个变量, 当它最低位为0时, 那么系统也认定0,BOOL值为NO.举个例子:
//
// main.m
// xiaomin
//
// Created by xiao min on 2018/6/1.
// Copyright © 2018年 xiao min. All rights reserved.
//
#import <Foundation/Foundation.h>
BOOL isDifferent(int x, int y) {
return x-y;
}
NSString *boolDifferent(BOOL numBool) {
if (numBool) {
return @"YES";
}else{
return @"NO";
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int x = 19;
int y = 32;
NSLog(@"%i and %i ,%@ different!", x, y, boolDifferent(isDifferent(x, y)));
}
return 0;
}
很有意思的一个比喻, 当你改动一个地方:
NSString *boolDifferent(BOOL numBool) {
if (numBool == YES) {
return @"YES";
}else{
return @"NO";
}
}
就会出现之前说的BUG. 最低位为0, 但是高位不为0.在C语言里就是true, 在OC的BOOL里就是NO. 这里巧妙的用if()
这个选择结构, C风格. 里面判断的就是为零
或者不为零
.成功解决BUG. 这里NSLog
里有个%@
符号,是用来被对象替换的, 对象替换%@的过程会自动使用NSObject父类里description方法输出对象的描述.