征战Objective-C

Objective-C 下面简称OC

源代码文件扩展名对比

一般来说,头文件是放声明, 实现文件放实现的代码

头文件 实现文件
c语言 .h .c
c++语言 .h .cpp
oc语言 .h .m
oc&c++ .h .mm

面向对象概览

类的定义

1
2
3
// 当前的SimpleClass 继承 NSObject 类
@interface SimpleClass: NSObject
@end

类的属性申明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@interface Person:
NSObject

@property NSString
*firstName;

@property NSString
*lastName;

@property NSNumber *yearOfBirth;

@property int yearOfBirth;

@property (readonly) NSString *firstName;

@end

减号方法(普通方法又称对象方法)声明

1
2
3
4
5
@interface Person: NSObject
- (void) someMethod;
- (void) someMethodWithValue: (SomeType)value;
- (void) someMethodWithFirstValue: (SomeType)info1 secondValue: (AnotherType)info2;
@end

加号方法 (类方法, 又称静态方法) 声明

1
2
3
4
5
6
7
8
9
@interface NSString: NSObject
+(id)string;
+(id)stringWithString:(NSString *)aString;
+(id)stringWithFormat:(NSString *)format, ..;
+(id)stringWithContentsOfFile: (NSString *)path
encoding: (NSStringEncoding)enc error:(NSError **)error;
+(id)stringWithCString: (const char *)cString
encoding: (NSStringEncoding)enc;
@end

类的实现

1
2
3
#import 'XYZPerson.h'
@implementation XYZPerson
@end

完成的例子

XYZPerson.h 文件
1
2
3
@interface XYZPerson: NSObject
-(void)sayHello;
@end
XYZPerson.m 文件
1
2
3
4
5
6
7
#import "XYZPerson.h"

@implementation XYZPerson
-(void)sayHello {
NSLog(@"Hello, World!");
}
@end

Hello World

首先去app store 下载xCode. 打开xCode

选择左侧 Create a new Xcode project=>macOS=> Command Line Tool选择保存项目的位置
create

进入项目后点击左上角箭头运行,如果下面控制台有输出 hello world 则代表运行成功了。
run

1
2
3
4
5
6
7
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 真正开始写代码的地方
}
return 0;
}

ObjectiveC 变量与表达式

声明变量与简单运算

1
2
3
4
5
int a = 0;
int b = 1;
b = 3;
int c = a + b;
NSLog(@"变量a+ b的值等于: %d", c); // %d 格式化输出,后面加个逗号再加变量

基础类型

1
2
3
4
5
6
int int a = 0; 整数 占322进制
float float a = 1.0; 浮点数 占322进制
double double num; 双精度 占64位 可以保存更大的数
char char c = 'A'; 单字符串 单引号
NSString: @"Hello world" 使用比较多 双引号 (高级类型)
C语言字符串类型 "hello world" 使用比较少

限定词

1
2
3
4
5
long: long int a; 比int 更大的整形
long long: long long int a; 比 long int 更大 具体应用才会涉及 比如大数据等
short: short int a; short a; 小于或等于整形, 16位 比较省类型,但是比较少用这些,一般直接用 int
unsigned: unsigned int a; 无符号
signed: signed int a; 有符号(正负类型)

运算

1
2
3
4
5
6
7
8
9
10
int a = 1;
a++;
++a;
a--;
--a;

一元 ++, --,
二元 +, -, *, /, %
三元 2>3?Yes:Not
逻辑符号 <, >, >=, <=, ==, !=

if

1
2
3
4
5
6
7
8
// 如果是真的会返回 1,如果未假返回 0;
if (True) {
// is True
} else {
// do something
}
// 只要非0就是真的。
if (1) NSLog(@"对"); else NSLog(@"错"); // 单行可以不写括号

goto语法

1
2
3
4
5
6
7
	int i = 0;
a: {
i++;
NSLog(@"i的值为 %d", i); // 先输出一个 i = 0;
}
if (i < 5) goto a; // 执行到这里i < 5 跳转到a 去执行。 直到 i == 5
// 最后输出 0, 1, 2, 3, 4

while 循环 比较常用

1
2
3
4
5
int a = 0;
while ( a < 5) {
a++;
NSLog(@"a的变量是 %d", a);
}

for循环 比较常用

1
2
3
for (int i= 0; i < 10; i++) {
NSLog(@"i=%d", i);
}

do while 肯定会执行一次再判断是否循环

1
2
3
do {
NSLog(@"hehe");
} while (0);

break continue

1
2
break 可以在 循环中 退出循环
continue 可以在 循环中 跳出当前循环,继续下一项循环

switch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int i = 10.0;
// char int float
switch (i) {
case 1:
NSLog(@"i = 1");
break;
case 2:
NSLog(@"i = 2");
break;
case 10:
NSLog(@"i = 10");
break;
default:
NSLog(@"i = 10.0");
}
// 最后会输出一个 10。

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 求矩形面积的函数 s = a * b;
// 返回的类型 函数名 ([(参数类型, 参数名), (参数类型, 参数名)])
double qiumianji(double a, double b) {
double s = a * b;
return s;
}

// 调用 main 函数内。
// 一个相同类型的变量来接收返回值
double s = qiumianji(10.0, 5.0);
NSLog(@"s 的值为 %f", s); // %d 输出整数, %f 输出浮点数

// 如果没有返回值,则调用函数的时候不用一个变量去接收
void show() {
NSLog(@"this is a test !");
NSLog(@"this is a test2 !");
NSLog(@"this is a test3 !");
}

// main 函数内调用
show();

main函数中的默认参数

1
2
3
4
5
NSLog(@"argc=%d", argc);
// argv 参数为 命令行输入命令运行的参数如: les1 -h -c -a -l 则有5个参数[les1, -h, -c, -a, -l]
for (int i =0; i < argc; i++) {
NSLog(@"%s", argv[i]);
}

输出目前遇到的总结

1
2
3
4
5
6
7
NSLog(@"type %d", a); 
- %d int;
- %s char *;
- %f float;
- %p 指针类型
- %@ NSString
- %ld 目前遇到过的有 NSRange.length || NSRange.location