开源 Objective-C IOS 应用开发(七)Objective-C核心代码示例

  文章的目的为了记录使用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);

详细讲解:

  • intfloatdoublechar 是 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可以像变量一样传递和存储

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值