文章的目的为了记录使用Objective-C 进行IOS app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。
相关链接:
开源 Objective-C IOS 应用开发(一)macOS 的使用
开源 Objective-C IOS 应用开发(二)Xcode安装
开源 Objective-C IOS 应用开发(三)第一个iPhone的APP
开源 Objective-C IOS 应用开发(四)Xcode工程文件结构
开源 Objective-C IOS 应用开发(五)iOS操作(action)和输出口(Outlet)
开源 Objective-C IOS 应用开发(六)Objective-C 和 C语言
开源 Objective-C IOS 应用开发(七)Objective-C核心代码示例
开源 Objective-C IOS 应用开发(八)常见控件UI
开源 Objective-C IOS 应用开发(九)复杂控件-tableview
开源 Objective-C IOS 应用开发(十)数据持久化--文件
开源 Objective-C IOS 应用开发(十一)数据持久化--sqlite
开源 Objective-C IOS 应用开发(十二)通讯--ble
开源 Objective-C IOS 应用开发(十三)通讯--Http访问
开源 Objective-C IOS 应用开发(十四)传感器--陀螺仪和gps
开源 Objective-C IOS 应用开发(十五)通讯--蓝牙ble扫描
开源 Objective-C IOS 应用开发(十六)Storyboard模式下的纯代码界面
开源 Objective-C IOS 应用开发(十七)CAF音频的录制
开源 Objective-C IOS 应用开发(十八)音频的播放
开源 Objective-C IOS 应用开发(十九)视频的播放
开源 Objective-C IOS 应用开发(二十)多线程处理
开源 Objective-C IOS 应用开发(二十一)自定义控件--示波器
开源 Objective-C IOS 应用开发(二十二)自定义控件--车速仪表盘
推荐链接:
开源 Arkts 鸿蒙应用 开发(一)工程文件分析-优快云博客
开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用-优快云博客
开源 Arkts 鸿蒙应用 开发(三)Arkts的介绍-优快云博客
开源 Arkts 鸿蒙应用 开发(四)布局和常用控件-优快云博客
开源 Arkts 鸿蒙应用 开发(五)控件组成和复杂控件-优快云博客
开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储-优快云博客
开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库-优快云博客
开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机-优快云博客
开源 Arkts 鸿蒙应用 开发(九)通讯--tcp客户端-优快云博客
开源 Arkts 鸿蒙应用 开发(十)通讯--Http-优快云博客
开源 Arkts 鸿蒙应用 开发(十一)证书和包名修改-优快云博客
开源 Arkts 鸿蒙应用 开发(十二)传感器的使用-优快云博客
开源 Arkts 鸿蒙应用 开发(十三)音频--MP3播放_arkts avplayer播放音频 mp3-优快云博客
开源 Arkts 鸿蒙应用 开发(十四)线程--任务池(taskpool)-优快云博客
开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘-优快云博客
开源 Arkts 鸿蒙应用 开发(十六)自定义绘图控件--波形图-优快云博客
开源 Arkts 鸿蒙应用 开发(十七)通讯--http多文件下载-优快云博客
开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器-优快云博客
推荐链接:
开源 java android app 开发(一)开发环境的搭建-优快云博客
开源 java android app 开发(二)工程文件结构-优快云博客
开源 java android app 开发(三)GUI界面布局和常用组件-优快云博客
开源 java android app 开发(四)GUI界面重要组件-优快云博客
开源 java android app 开发(五)文件和数据库存储-优快云博客
开源 java android app 开发(六)多媒体使用-优快云博客
开源 java android app 开发(七)通讯之Tcp和Http-优快云博客
开源 java android app 开发(八)通讯之Mqtt和Ble-优快云博客
开源 java android app 开发(九)后台之线程和服务-优快云博客
开源 java android app 开发(十)广播机制-优快云博客
开源 java android app 开发(十一)调试、发布-优快云博客
开源 java android app 开发(十二)封库.aar-优快云博客
本章内容主要对Objective-C的核心代码示例,目的是为了快速的使用Objective-C进行编程,下面的代码可以直接搬运使用,多用多看才能多想多懂,才是最快的学习方法。

1. 数据类型和变量
objective-c
// 基本数据类型 int age = 25; // 整型,存储整数 float price = 99.99f; // 单精度浮点数,f表示float类型 double salary = 8500.50; // 双精度浮点数,精度比float更高 BOOL isActive = YES; // Objective-C的布尔类型,YES/NO char grade = 'A'; // 字符类型,存储单个字符 // Objective-C 对象类型(指针类型) NSString *name = @"John"; // 字符串对象,@""是字符串字面量语法 NSNumber *count = @42; // 数字对象,@数字将基本类型转为对象 NSArray *array = @[@1, @2]; // 数组对象,@[]是数组字面量语法 NSLog(@"int: %d, float: %.2f, string: %@", age, price, name);
详细讲解:
-
int,float,double,char是 C 语言的基本数据类型 -
BOOL是 Objective-C 特有的布尔类型,值为YES或NO -
所有 Objective-C 对象都是用指针声明的(
*符号) -
@符号是 Objective-C 的字面量语法,用于创建对象 -
NSLog是输出函数,%@是对象的格式化符
2. 运算符与表达式
objective-c
int a = 10, b = 3; // 算术运算符 int sum = a + b; // 加法,结果为13 int quotient = a / b; // 整数除法,结果为3(小数部分被截断) // 比较运算符 BOOL isEqual = (a == b); // 相等比较,10==3为NO BOOL isGreater = (a > b); // 大于比较,10>3为YES // 逻辑运算符 BOOL result = (a > 5) && (b < 5); // 逻辑与,两个条件都为真才返回YES // 三元运算符 NSString *status = (a > 5) ? @"大于5" : @"小于等于5"; // 如果a>5为真,返回@"大于5",否则返回@"小于等于5"
详细讲解:
-
算术运算符:
+,-,*,/,%(取模) -
比较运算符:
==,!=,>,<,>=,<= -
逻辑运算符:
&&(与),||(或),!(非) -
三元运算符:
条件 ? 值1 : 值2是 if-else 的简写形式
3. 流程控制
objective-c
// if-else 条件语句
int score = 85;
if (score >= 90) {
NSLog(@"优秀");
} else if (score >= 60) {
NSLog(@"及格"); // 85>=60,所以输出这个
} else {
NSLog(@"不及格");
}
// switch-case 多分支语句
char grade = 'B';
switch (grade) {
case 'A':
NSLog(@"优秀");
break; // break防止执行下一个case
case 'B':
NSLog(@"良好"); // grade='B',所以输出这个
break;
default: // 其他所有情况
NSLog(@"其他");
}
// for 循环
for (int i = 0; i < 3; i++) {
NSLog(@"i = %d", i); // 输出 i = 0, i = 1, i = 2
}
// 快速枚举(for-in)循环
NSArray *fruits = @[@"苹果", @"香蕉", @"橙子"];
for (NSString *fruit in fruits) {
NSLog(@"水果: %@", fruit); // 依次输出每个水果
}
详细讲解:
-
if-else根据条件执行不同的代码块 -
switch-case适合多个确定值的比较,必须用break结束每个 case -
for循环:初始化; 条件; 增量 -
for-in循环专门用于遍历集合对象
4. 函数(方法)
objective-c
// 函数声明(在 .h 头文件中)
- (int)addNumber:(int)a toNumber:(int)b;
// 函数实现(在 .m 实现文件中)
- (int)addNumber:(int)a toNumber:(int)b {
return a + b; // 返回两个数的和
}
// 使用
int result = [self addNumber:5 toNumber:3]; // result = 8
详细讲解:
-
-号表示实例方法,需要对象来调用 -
(int)是返回值类型 -
addNumber:toNumber:是方法名,包含两个参数标签 -
(int)a和(int)b是参数类型和参数名 -
Objective-C 的方法调用称为"发送消息"
5. 数组与字符串
objective-c
// 不可变数组 - 创建后不能修改 NSArray *colors = @[@"红色", @"绿色", @"蓝色"]; NSString *firstColor = colors[0]; // 通过下标访问,@"红色" // 可变数组 - 可以动态修改 NSMutableArray *list = [NSMutableArray array]; // 创建空数组 [list addObject:@"第一项"]; // 添加元素 [list removeLastObject]; // 删除最后一个元素 // 字符串操作 NSString *text = @"Hello Objective-C"; NSString *upper = [text uppercaseString]; // 转为大写 BOOL contains = [text containsString:@"Hello"]; // 检查是否包含子串 NSString *substring = [text substringToIndex:5]; // 截取前5个字符
详细讲解:
-
NSArray不可变,创建后内容不能改变 -
NSMutableArray可变,可以添加、删除、修改元素 -
字符串操作都是返回新字符串,原字符串不变
-
数组下标从 0 开始
6. 消息传递语法
objective-c
NSString *name = @"World"; // 无参数消息 NSUInteger length = [name length]; // 向name对象发送length消息,返回字符串长度5 // 单参数消息 NSString *upperName = [name uppercaseString]; // 发送uppercaseString消息,返回新字符串@"WORLD" // 多参数消息(Objective-C特色) NSString *greeting = [name stringByAppendingString:@"!"]; // 发送stringByAppendingString:消息,参数是@"!" // 返回拼接后的字符串@"World!"
详细讲解:
-
[对象 消息]是 Objective-C 的核心语法 -
消息在运行时动态解析,非常灵活
-
多参数方法的格式:
[对象 第一部分:参数1 第二部分:参数2] -
这种语法让代码读起来像自然语言
7. 类的定义
Person.h(头文件 - 声明接口)
objective-c
#import <Foundation/Foundation.h> // 导入Foundation框架 @interface Person : NSObject // Person类继承自NSObject // 属性声明 @property (nonatomic, strong) NSString *name; // 字符串属性 @property (nonatomic, assign) NSInteger age; // 整数属性 // 方法声明 - (void)introduce; // 实例方法,无参数无返回值 @end
Person.m(实现文件 - 实现功能)
objective-c
#import "Person.h" // 导入自己的头文件
@implementation Person // 实现Person类
- (void)introduce {
// self指向当前对象实例
NSLog(@"我叫%@,今年%ld岁", self.name, (long)self.age);
}
@end
使用类
objective-c
Person *person = [[Person alloc] init]; // 创建对象:分配内存+初始化 person.name = @"张三"; // 设置属性值 person.age = 25; // 设置属性值 [person introduce]; // 调用方法:输出"我叫张三,今年25岁"
详细讲解:
-
.h文件声明类的公共接口(属性、方法) -
.m文件实现类的具体功能 -
@interface和@implementation必须成对出现 -
NSObject是所有 Objective-C 类的根类 -
alloc分配内存,init初始化对象
8. 属性声明
objective-c
@interface Product : NSObject // strong: 强引用,对象会保持存活直到不再被引用 @property (nonatomic, strong) NSString *productName; // weak: 弱引用,不保持对象存活,用于避免循环引用 @property (nonatomic, weak) id delegate; // copy: 创建副本,防止可变对象被外部修改 @property (nonatomic, copy) NSString *uniqueID; // assign: 用于基本数据类型,不进行内存管理 @property (nonatomic, assign) NSInteger productId; // readonly: 只读属性,外部只能读取不能修改 @property (nonatomic, strong, readonly) NSDate *createDate; @end
详细讲解:
-
strong:默认选择,对象会一直存在直到没有strong引用指向它 -
weak:用于委托模式、父视图引用等,避免循环引用导致内存泄漏 -
copy:常用于NSString,防止NSMutableString被意外修改 -
assign:用于int、float等基本数据类型 -
readonly:只生成getter方法,不生成setter方法 -
nonatomic:非原子性,性能更好(通常都用这个)
9. 字符串操作
objective-c
NSString *text = @"Hello iOS Developer"; // 常用方法 NSUInteger len = [text length]; // 获取长度: 19 NSString *upper = [text uppercaseString]; // 转为大写 BOOL hasHello = [text hasPrefix:@"Hello"]; // 检查前缀: YES BOOL hasDeveloper = [text hasSuffix:@"Developer"]; // 检查后缀: YES // 分割字符串 NSString *csv = @"苹果,香蕉,橙子"; NSArray *items = [csv componentsSeparatedByString:@","]; // 结果: @[@"苹果", @"香蕉", @"橙子"] // 格式化字符串 NSString *formatted = [NSString stringWithFormat:@"%@-%d", @"ID", 1001]; // 结果: @"ID-1001"
详细讲解:
-
NSString 是不可变字符串,所有操作都返回新字符串
-
length返回字符个数(不是字节数) -
uppercaseString/lowercaseString大小写转换 -
hasPrefix/hasSuffix检查开头和结尾 -
componentsSeparatedByString:按分隔符分割字符串 -
stringWithFormat:格式化字符串,类似NSLog
10. 集合类
objective-c
// NSArray - 不可变数组(创建后不能修改)
NSArray *numbers = @[@1, @2, @3]; // 字面量语法创建数组
NSNumber *first = numbers[0]; // 下标访问,@1
// NSMutableArray - 可变数组(可以动态修改)
NSMutableArray *mutArray = [NSMutableArray arrayWithArray:numbers];
[mutArray addObject:@4]; // 添加元素到末尾
[mutArray removeObjectAtIndex:0]; // 删除指定索引的元素
// NSDictionary - 字典(键值对集合)
NSDictionary *info = @{@"name": @"John", @"age": @25};
NSString *userName = info[@"name"]; // 通过键访问值,@"John"
// NSMutableDictionary - 可变字典
NSMutableDictionary *mutDict = [NSMutableDictionary dictionary];
mutDict[@"score"] = @95; // 设置键值对
[mutDict removeObjectForKey:@"age"]; // 删除指定键
详细讲解:
-
NSArray/NSMutableArray:有序集合,通过索引访问
-
NSDictionary/NSMutableDictionary:无序键值对集合,通过键访问
-
@[]数组字面量,@{}字典字面量 -
数组下标从 0 开始,访问越界会崩溃
11. 内存管理
objective-c
@interface User : NSObject // strong: 强引用,默认选择,对象会保持存活 @property (nonatomic, strong) NSString *userName; // weak: 弱引用,不保持对象存活,用于避免循环引用 @property (nonatomic, weak) id delegate; // copy: 创建副本,保护原始数据不被修改 @property (nonatomic, copy) NSString *userID; @end // 使用示例 NSString *originalID = [[NSString alloc] initWithString:@"123"]; User *user = [[User alloc] init]; user.userID = originalID; // 这里会创建originalID的副本,即使originalID被修改,user.userID也不变
详细讲解:
-
strong:增加引用计数,对象会一直存活
-
weak:不增加引用计数,对象可能被释放,自动置为nil
-
copy:调用对象的copy方法创建新副本
-
ARC(自动引用计数)自动管理内存,但我们仍需理解这些概念
12. 协议和委托
协议定义 (.h文件)
objective-c
@protocol DataLoaderDelegate <NSObject> // 定义协议 - (void)dataDidFinishLoading:(NSArray *)data; // 必须实现的方法 @optional // 以下方法是可选的 - (void)dataDidFailWithError:(NSError *)error; @end
使用协议
objective-c
@interface DataManager : NSObject
@property (nonatomic, weak) id<DataLoaderDelegate> delegate; // 委托属性
- (void)loadData;
@end
@implementation DataManager
- (void)loadData {
// 模拟数据加载完成
if ([self.delegate respondsToSelector:@selector(dataDidFinishLoading:)]) {
// 检查委托是否实现了该方法
[self.delegate dataDidFinishLoading:@[@"数据1", @"数据2"]];
}
}
@end
详细讲解:
-
协议:定义一组方法,类似其他语言的接口
-
委托:一种设计模式,对象把某些任务交给其他对象处理
-
@required:必须实现的方法(默认) -
@optional:可选实现的方法 -
respondsToSelector:检查对象是否实现了某个方法
13. 初始化方法
objective-c
@interface Student : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger grade;
// 自定义初始化方法
- (instancetype)initWithName:(NSString *)name grade:(NSInteger)grade;
@end
@implementation Student
- (instancetype)initWithName:(NSString *)name grade:(NSInteger)grade {
self = [super init]; // 调用父类初始化
if (self) { // 检查初始化是否成功
_name = name; // 直接设置实例变量
_grade = grade;
}
return self; // 返回初始化后的对象
}
@end
// 使用
Student *student = [[Student alloc] initWithName:@"小明" grade:3];
详细讲解:
-
instancetype:表示返回类型的实例,比id更安全 -
必须先调用
[super init]初始化父类 -
检查
if (self)确保父类初始化成功 -
_name直接访问实例变量(由@property自动生成) -
自定义初始化方法通常以
initWith开头
14. 类方法
objective-c
@interface MathUtil : NSObject
// 类方法 (+ 号),无需创建实例即可调用
+ (NSInteger)maxValueBetween:(NSInteger)a and:(NSInteger)b;
+ (CGFloat)calculateCircleArea:(CGFloat)radius;
@end
@implementation MathUtil
+ (NSInteger)maxValueBetween:(NSInteger)a and:(NSInteger)b {
return (a > b) ? a : b; // 返回较大的值
}
+ (CGFloat)calculateCircleArea:(CGFloat)radius {
return 3.14159 * radius * radius; // 计算圆面积
}
@end
// 使用类方法(无需创建对象)
NSInteger max = [MathUtil maxValueBetween:10 and:20]; // 20
CGFloat area = [MathUtil calculateCircleArea:5.0]; // 78.53975
详细讲解:
-
+号表示类方法,-号表示实例方法 -
类方法通过类名调用,不需要创建对象实例
-
类方法内不能访问实例变量(因为没有实例)
-
常用于工具方法、工厂方法等
15. Block语法
objective-c
// Block 类型定义
typedef void (^CompletionBlock)(BOOL success, NSString *message);
// 使用 Block 作为参数的方法
- (void)downloadDataWithCompletion:(CompletionBlock)completion {
// 模拟网络请求(延迟执行)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
if (completion) {
completion(YES, @"下载完成"); // 调用Block
}
});
}
// 调用带 Block 的方法
[self downloadDataWithCompletion:^(BOOL success, NSString *message) {
if (success) {
NSLog(@"%@", message); // 输出: "下载完成"
}
}];
// 简单 Block 示例
void (^simpleBlock)(void) = ^{ // 定义Block变量
NSLog(@"这是一个简单的Block");
};
simpleBlock(); // 执行 Block
详细讲解:
-
Block:匿名函数,可以捕获上下文变量
-
语法:
^返回值类型(参数列表) { 代码 } -
常用于异步操作、回调函数
-
typedef定义Block类型,使代码更清晰 -
Block可以像变量一样传递和存储
1288

被折叠的 条评论
为什么被折叠?



