Objective-C 核心语法深度解析:基本类型、集合类与代码块实战指南

详细讲解:Objective-C 基本类型、集合类和代码块
一、基本类型详解
1.1 主要基本类型

复制代码
// MyTypes.m
#import <Foundation/Foundation.h>

void demonstrateBasicTypes() {
    NSLog(@"========== 基本类型演示 ==========");
    
    // 1. BOOL 类型(实际上是 signed char)
    BOOL isOpen = YES;  // YES = 1, NO = 0
    BOOL isClosed = NO;
    NSLog(@"BOOL: isOpen = %d, isClosed = %d", isOpen, isClosed);
    
    // 2. 整数类型
    NSInteger integerNumber = 42;          // 64位系统上为 long, 32位系统上为 int
    NSUInteger unsignedInteger = 100;      // 无符号整数
    NSLog(@"NSInteger: %ld, NSUInteger: %lu", 
          (long)integerNumber, 
          (unsigned long)unsignedInteger);
    
    // 3. 浮点数类型
    CGFloat floatNumber = 3.14159;         // 64位系统上为 double, 32位系统上为 float
    double doubleNumber = 2.71828;
    NSLog(@"CGFloat: %f, Double: %f", floatNumber, doubleNumber);
    
    // 4. 字符和字符串
    char character = 'A';
    const char *cString = "C String";
    NSString *nsString = @"Objective-C String";
    NSLog(@"char: %c, C String: %s, NSString: %@", character, cString, nsString);
    
    // 5. 特殊对象类型
    id genericObject = @"这是一个字符串对象";  // 可以指向任何Objective-C对象
    SEL selector = @selector(description);    // 方法选择器
    Class stringClass = [NSString class];     // 类对象
    
    NSLog(@"id对象: %@", genericObject);
    NSLog(@"SEL: %@", NSStringFromSelector(selector));
    NSLog(@"Class: %@", stringClass);
    
    // 6. instancetype (返回实例类型,用于初始化方法)
    // 在自定义类中会自动推断类型
    
    // 7. 数值包装类 NSNumber
    NSNumber *intNumber = @42;               // 字面量语法
    NSNumber *floatNum = @3.14f;
    NSNumber *boolNum = @YES;
    NSNumber *charNum = @'X';
    
    NSLog(@"NSNumber int: %@", intNumber);
    NSLog(@"NSNumber float: %@", floatNum);
    NSLog(@"NSNumber bool: %@", boolNum);
    NSLog(@"NSNumber char: %@", charNum);
    
    // 从NSNumber提取值
    int intValue = [intNumber intValue];
    float floatValue = [floatNum floatValue];
    BOOL boolValue = [boolNum boolValue];
    char charValue = [charNum charValue];
    
    NSLog(@"提取的值: int=%d, float=%f, bool=%d, char=%c", 
          intValue, floatValue, boolValue, charValue);
}

1.2 类型转换和检查

复制代码
// TypeConversion.m
#import <Foundation/Foundation.h>

void demonstrateTypeConversion() {
    NSLog(@"========== 类型转换演示 ==========");
    
    // 基本类型之间的转换
    NSInteger integer = 100;
    CGFloat cgFloat = (CGFloat)integer;  // 显式转换
    NSLog(@"NSInteger %ld -> CGFloat %f", (long)integer, cgFloat);
    
    // NSNumber 与基本类型的转换
    NSNumber *number = @99;
    NSInteger fromNumber = [number integerValue];
    NSLog(@"NSNumber %@ -> NSInteger %ld", number, (long)fromNumber);
    
    // 类型检查
    id object = @"Hello";
    
    // 检查是否是特定类
    if ([object isKindOfClass:[NSString class]]) {
        NSLog(@"对象是NSString或子类");
    }
    
    // 检查是否是特定类(精确匹配)
    if ([object isMemberOfClass:[NSString class]]) {
        NSLog(@"对象是NSString(不是子类)");
    }
    
    // 响应方法检查
    if ([object respondsToSelector:@selector(length)]) {
        NSLog(@"对象响应length方法");
    }
    
    // 空值检查
    id nilObject = nil;
    if (nilObject == nil) {
        NSLog(@"对象为nil");
    }
    
    // 安全调用(如果对象为nil,调用不会崩溃)
    [nilObject description];  // 什么也不发生
    
    // 条件初始化
    NSString *result = object ?: @"默认值";
    NSLog(@"结果: %@", result);
}

二、集合类详解
2.1 NSArray / NSMutableArray

复制代码
// CollectionsDemo.m
#import <Foundation/Foundation.h>

void demonstrateArrays() {
    NSLog(@"========== 数组演示 ==========");
    
    // 1. 不可变数组 NSArray
    // 字面量语法(推荐)
    NSArray *immutableArray = @[@"苹果", @"香蕉", @"橙子", @"葡萄"];
    NSLog(@"不可变数组: %@", immutableArray);
    
    // 传统创建方式
    NSArray *traditionalArray = [NSArray arrayWithObjects:@"张三", @"李四", @"王五", nil];
    
    // 2. 访问数组元素
    NSLog(@"第一个元素: %@", immutableArray[0]);              // 下标访问
    NSLog(@"第二个元素: %@", [immutableArray objectAtIndex:1]); // 方法访问
    
    // 3. 遍历数组
    NSLog(@"--- 快速枚举遍历 ---");
    for (NSString *fruit in immutableArray) {
        NSLog(@"水果: %@", fruit);
    }
    
    NSLog(@"--- 传统for循环 ---");
    for (NSUInteger i = 0; i < [immutableArray count]; i++) {
        NSLog(@"索引%lu: %@", (unsigned long)i, immutableArray[i]);
    }
    
    NSLog(@"--- 枚举器遍历 ---");
    NSEnumerator *enumerator = [immutableArray objectEnumerator];
    NSString *item;
    while (item = [enumerator nextObject]) {
        NSLog(@"枚举器: %@", item);
    }
    
    // 4. 数组操作
    NSLog(@"数组长度: %lu", (unsigned long)[immutableArray count]);
    NSLog(@"是否包含'香蕉': %@", [immutableArray containsObject:@"香蕉"] ? @"是" : @"否");
    NSLog(@"'橙子'的索引: %lu", (unsigned long)[immutableArray indexOfObject:@"橙子"]);
    
    // 5. 子数组
    NSArray *subArray = [immutableArray subarrayWithRange:NSMakeRange(1, 2)];
    NSLog(@"子数组: %@", subArray);
    
    // 6. 数组合并
    NSArray *array1 = @[@"A", @"B"];
    NSArray *array2 = @[@"C", @"D"];
    NSArray *mergedArray = [array1 arrayByAddingObjectsFromArray:array2];
    NSLog(@"合并后数组: %@", mergedArray);
    
    // 7. 可变数组 NSMutableArray
    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:@[@"北京", @"上海"]];
    NSLog(@"原始可变数组: %@", mutableArray);
    
    // 添加元素
    [mutableArray addObject:@"广州"];
    [mutableArray addObject:@"深圳"];
    NSLog(@"添加后: %@", mutableArray);
    
    // 插入元素
    [mutableArray insertObject:@"杭州" atIndex:1];
    NSLog(@"插入后: %@", mutableArray);
    
    // 替换元素
    mutableArray[2] = @"南京";
    NSLog(@"替换后: %@", mutableArray);
    
    // 删除元素
    [mutableArray removeObject:@"上海"];
    [mutableArray removeObjectAtIndex:0];
    NSLog(@"删除后: %@", mutableArray);
    
    // 8. 数组排序
    NSArray *unsorted = @[@5, @2, @8, @1, @9];
    NSArray *sorted = [unsorted sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"排序前: %@", unsorted);
    NSLog(@"排序后: %@", sorted);
    
    // 9. 使用NSPredicate过滤
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self > 3"];
    NSArray *filtered = [unsorted filteredArrayUsingPredicate:predicate];
    NSLog(@"大于3的元素: %@", filtered);
}

2.2 NSDictionary / NSMutableDictionary

复制代码
void demonstrateDictionaries() {
    NSLog(@"========== 字典演示 ==========");
    
    // 1. 不可变字典 NSDictionary
    // 字面量语法(推荐)
    NSDictionary *immutableDict = @{
        @"name": @"张三",
        @"age": @25,
        @"city": @"北京",
        @"isStudent": @YES
    };
    NSLog(@"不可变字典: %@", immutableDict);
    
    // 传统创建方式
    NSDictionary *traditionalDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                     @"李四", @"name",
                                     @30, @"age",
                                     nil];
    
    // 2. 访问字典值
    NSLog(@"姓名: %@", immutableDict[@"name"]);                    // 下标访问
    NSLog(@"年龄: %@", [immutableDict objectForKey:@"age"]);      // 方法访问
    
    // 3. 遍历字典
    NSLog(@"--- 快速枚举遍历键 ---");
    for (NSString *key in immutableDict) {
        id value = immutableDict[key];
        NSLog(@"%@: %@", key, value);
    }
    
    NSLog(@"--- 遍历键值对 ---");
    [immutableDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"Block遍历: %@ = %@", key, obj);
        // 可以设置 *stop = YES; 来停止遍历
    }];
    
    // 4. 字典操作
    NSLog(@"所有键: %@", [immutableDict allKeys]);
    NSLog(@"所有值: %@", [immutableDict allValues]);
    NSLog(@"键数量: %lu", (unsigned long)[immutableDict count]);
    
    // 5. 可变字典 NSMutableDictionary
    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
    
    // 添加键值对
    mutableDict[@"name"] = @"王五";
    [mutableDict setObject:@28 forKey:@"age"];
    [mutableDict setObject:@"上海" forKey:@"city"];
    NSLog(@"原始可变字典: %@", mutableDict);
    
    // 修改值
    mutableDict[@"age"] = @29;
    NSLog(@"修改年龄后: %@", mutableDict);
    
    // 删除键值对
    [mutableDict removeObjectForKey:@"city"];
    NSLog(@"删除城市后: %@", mutableDict);
    
    // 添加多个键值对
    NSDictionary *newEntries = @{@"job": @"工程师", @"salary": @15000};
    [mutableDict addEntriesFromDictionary:newEntries];
    NSLog(@"添加多个后: %@", mutableDict);
    
    // 6. 字典合并
    NSDictionary *dict1 = @{@"a": @1, @"b": @2};
    NSDictionary *dict2 = @{@"b": @3, @"c": @4};  // 注意:b会覆盖
    NSMutableDictionary *combined = [dict1 mutableCopy];
    [combined addEntriesFromDictionary:dict2];
    NSLog(@"合并后: %@ (b被覆盖为3)", combined);
}

2.3 NSSet / NSMutableSet

复制代码
void demonstrateSets() {
    NSLog(@"========== 集合演示 ==========");
    
    // 1. 不可变集合 NSSet(无序,元素唯一)
    NSSet *immutableSet = [NSSet setWithObjects:@"A", @"B", @"C", @"A", @"B", nil];
    NSLog(@"不可变集合 (自动去重): %@", immutableSet);
    
    // 2. 遍历集合
    NSLog(@"--- 快速枚举遍历 ---");
    for (NSString *element in immutableSet) {
        NSLog(@"元素: %@", element);
    }
    
    NSLog(@"--- 枚举器遍历 ---");
    NSEnumerator *enumerator = [immutableSet objectEnumerator];
    id obj;
    while (obj = [enumerator nextObject]) {
        NSLog(@"枚举器: %@", obj);
    }
    
    // 3. 集合操作
    NSSet *set1 = [NSSet setWithObjects:@"A", @"B", @"C", @"D", nil];
    NSSet *set2 = [NSSet setWithObjects:@"C", @"D", @"E", @"F", nil];
    
    // 交集
    NSMutableSet *intersection = [set1 mutableCopy];
    [intersection intersectSet:set2];
    NSLog(@"交集 (set1 ∩ set2): %@", intersection);
    
    // 并集
    NSMutableSet *unionSet = [set1 mutableCopy];
    [unionSet unionSet:set2];
    NSLog(@"并集 (set1 ∪ set2): %@", unionSet);
    
    // 差集
    NSMutableSet *difference = [set1 mutableCopy];
    [difference minusSet:set2];
    NSLog(@"差集 (set1 - set2): %@", difference);
    
    // 4. 可变集合 NSMutableSet
    NSMutableSet *mutableSet = [NSMutableSet setWithObjects:@"苹果", @"香蕉", nil];
    NSLog(@"原始可变集合: %@", mutableSet);
    
    // 添加元素
    [mutableSet addObject:@"橙子"];
    [mutableSet addObject:@"苹果"];  // 重复元素不会被添加
    NSLog(@"添加后: %@", mutableSet);
    
    // 删除元素
    [mutableSet removeObject:@"香蕉"];
    NSLog(@"删除后: %@", mutableSet);
    
    // 5. NSCountedSet(可以统计元素出现次数)
    NSCountedSet *countedSet = [NSCountedSet set];
    [countedSet addObject:@"苹果"];
    [countedSet addObject:@"香蕉"];
    [countedSet addObject:@"苹果"];
    [countedSet addObject:@"苹果"];
    
    NSLog(@"苹果出现次数: %lu", (unsigned long)[countedSet countForObject:@"苹果"]);
    NSLog(@"香蕉出现次数: %lu", (unsigned long)[countedSet countForObject:@"香蕉"]);
    NSLog(@"所有元素: %@", countedSet);
    
    // 6. 集合与数组转换
    NSArray *arrayWithDuplicates = @[@"A", @"B", @"A", @"C", @"B"];
    NSSet *uniqueSet = [NSSet setWithArray:arrayWithDuplicates];
    NSArray *uniqueArray = [uniqueSet allObjects];
    NSLog(@"原始数组: %@", arrayWithDuplicates);
    NSLog(@"去重后集合: %@", uniqueSet);
    NSLog(@"去重后数组: %@", uniqueArray);
}

三、代码块(Blocks)详解
3.1 Blocks 基础

复制代码
// BlocksDemo.m
#import <Foundation/Foundation.h>

// 定义块类型
typedef void (^SimpleBlock)(void);
typedef int (^CalculatorBlock)(int, int);
typedef NSString* (^FormatterBlock)(NSString*);

void demonstrateBasicBlocks() {
    NSLog(@"========== 代码块基础演示 ==========");
    
    // 1. 无参数无返回值块
    SimpleBlock simpleBlock = ^{
        NSLog(@"这是一个简单的代码块");
    };
    simpleBlock();
    
    // 2. 带参数和返回值的块
    CalculatorBlock addBlock = ^(int a, int b) {
        return a + b;
    };
    
    CalculatorBlock multiplyBlock = ^int(int a, int b) {
        return a * b;
    };
    
    int sum = addBlock(10, 20);
    int product = multiplyBlock(5, 6);
    NSLog(@"加法结果: %d", sum);
    NSLog(@"乘法结果: %d", product);
    
    // 3. 使用typedef定义的块
    FormatterBlock uppercaseBlock = ^(NSString *input) {
        return [input uppercaseString];
    };
    
    FormatterBlock greetingBlock = ^(NSString *name) {
        return [NSString stringWithFormat:@"你好, %@!", name];
    };
    
    NSLog(@"大写: %@", uppercaseBlock(@"hello"));
    NSLog(@"问候: %@", greetingBlock(@"张三"));
    
    // 4. 块作为方法参数
    NSArray *numbers = @[@1, @2, @3, @4, @5];
    
    // 使用块遍历数组
    [numbers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"元素[%lu]: %@", (unsigned long)idx, obj);
        
        // 可以提前停止遍历
        if (idx == 2) {
            *stop = YES;  // 停止遍历
        }
    }];
    
    // 5. 块内访问外部变量
    int externalValue = 100;
    
    // 默认是只读访问
    CalculatorBlock useExternalBlock = ^(int a, int b) {
        // externalValue = 200; // 错误:不能修改外部变量
        return a + b + externalValue;
    };
    NSLog(@"使用外部变量: %d", useExternalBlock(1, 2));
    
    // 使用__block修饰符使变量在块内可修改
    __block int mutableValue = 50;
    SimpleBlock modifyExternalBlock = ^{
        mutableValue += 10;
        NSLog(@"块内修改后: %d", mutableValue);
    };
    
    NSLog(@"修改前: %d", mutableValue);
    modifyExternalBlock();
    NSLog(@"修改后: %d", mutableValue);
}

3.2 Blocks 内存管理

复制代码
void demonstrateBlockMemoryManagement() {
    NSLog(@"========== 代码块内存管理演示 ==========");
    
    // 1. 块捕获变量
    NSString *capturedString = @"原始值";
    NSMutableArray *capturedArray = [NSMutableArray arrayWithObjects:@"A", @"B", nil];
    
    SimpleBlock captureBlock = ^{
        // 捕获对象引用(强引用)
        NSLog(@"捕获的字符串: %@", capturedString);
        NSLog(@"捕获的数组: %@", capturedArray);
        
        // 可以修改捕获的可变对象
        [capturedArray addObject:@"C"];
    };
    
    capturedString = @"修改后的值";  // 块捕获的是创建时的值
    NSLog(@"修改字符串后: %@", capturedString);
    captureBlock();
    NSLog(@"数组被块修改后: %@", capturedArray);
    
    // 2. 避免循环引用
    // 常见于对象持有块,块又捕获对象的情况
    
    // 创建临时对象来演示
    @autoreleasepool {
        NSMutableArray *retainedArray = [NSMutableArray new];
        [retainedArray addObject:@"数据"];
        
        // 错误:会导致循环引用
        // retainedArray 强引用 block
        // block 强引用 retainedArray
        // __weak typeof(retainedArray) weakArray = retainedArray;
        
        // 正确:使用弱引用
        __weak NSMutableArray *weakArray = retainedArray;
        [retainedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            // 使用弱引用避免循环引用
            if (weakArray) {
                NSLog(@"安全访问: %@", [weakArray objectAtIndex:0]);
            }
        }];
    }
    
    // 3. 块作为返回值
    CalculatorBlock createMultiplier(float multiplier) {
        // 返回的块捕获了multiplier参数
        return ^(int number) {
            return (int)(number * multiplier);
        };
    }
    
    CalculatorBlock timesTwo = createMultiplier(2.0);
    CalculatorBlock timesThree = createMultiplier(3.0);
    
    NSLog(@"2 * 5 = %d", timesTwo(5));
    NSLog(@"3 * 5 = %d", timesThree(5));
    
    // 4. 块的可变性和复制
    SimpleBlock originalBlock = ^{
        NSLog(@"原始块");
    };
    
    // 将块复制到堆上(如果需要保存或在其他地方使用)
    SimpleBlock copiedBlock = [originalBlock copy];
    copiedBlock();
}

3.3 Blocks 高级用法

复制代码
void demonstrateAdvancedBlocks() {
    NSLog(@"========== 代码块高级用法演示 ==========");
    
    // 1. 块作为字典值
    NSDictionary *operationMap = @{
        @"add": ^(NSNumber *a, NSNumber *b) {
            return @([a intValue] + [b intValue]);
        },
        @"subtract": ^(NSNumber *a, NSNumber *b) {
            return @([a intValue] - [b intValue]);
        },
        @"multiply": ^(NSNumber *a, NSNumber *b) {
            return @([a intValue] * [b intValue]);
        }
    };
    
    // 定义块类型以便从字典获取
    typedef NSNumber* (^OperationBlock)(NSNumber*, NSNumber*);
    
    OperationBlock addBlock = operationMap[@"add"];
    OperationBlock multiplyBlock = operationMap[@"multiply"];
    
    NSLog(@"10 + 5 = %@", addBlock(@10, @5));
    NSLog(@"10 * 5 = %@", multiplyBlock(@10, @5));
    
    // 2. 异步操作中使用块(回调)
    void simulateAsyncOperation(NSString *input, void (^completion)(NSString *result, NSError *error)) {
        // 模拟异步操作
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), 
                      dispatch_get_main_queue(), ^{
            if (input.length > 0) {
                NSString *result = [NSString stringWithFormat:@"处理后的: %@", [input uppercaseString]];
                completion(result, nil);
            } else {
                NSError *error = [NSError errorWithDomain:@"DemoError" 
                                                     code:100 
                                                 userInfo:@{NSLocalizedDescriptionKey: @"输入为空"}];
                completion(nil, error);
            }
        });
    }
    
    NSLog(@"开始异步操作...");
    simulateAsyncOperation(@"hello world", ^(NSString *result, NSError *error) {
        if (error) {
            NSLog(@"异步操作错误: %@", error.localizedDescription);
        } else {
            NSLog(@"异步操作完成: %@", result);
        }
    });
    
    // 3. 链式调用模式
    typedef NSString* (^StringProcessor)(NSString*);
    
    StringProcessor (^createPipeline)(NSArray<StringProcessor>) = ^(NSArray<StringProcessor> processors) {
        return ^(NSString *input) {
            __block NSString *result = input;
            [processors enumerateObjectsUsingBlock:^(StringProcessor processor, NSUInteger idx, BOOL *stop) {
                result = processor(result);
            }];
            return result;
        };
    };
    
    // 创建处理链
    NSArray *processors = @[
        ^(NSString *str) { return [str uppercaseString]; },
        ^(NSString *str) { return [str stringByReplacingOccurrencesOfString:@" " withString:@"_"]; },
        ^(NSString *str) { return [@"processed_" stringByAppendingString:str]; }
    ];
    
    StringProcessor pipeline = createPipeline(processors);
    NSString *finalResult = pipeline(@"hello world");
    NSLog(@"链式处理结果: %@", finalResult);
    
    // 4. 块递归调用(需要__block修饰)
    __block void (^recursiveBlock)(int);
    
    recursiveBlock = ^(int n) {
        if (n > 0) {
            NSLog(@"递归深度: %d", n);
            recursiveBlock(n - 1);  // 递归调用
        }
    };
    
    NSLog(@"开始递归:");
    recursiveBlock(3);
    
    // 5. 使用块实现排序
    NSArray *people = @[
        @{@"name": @"张三", @"age": @25},
        @{@"name": @"李四", @"age": @30},
        @{@"name": @"王五", @"age": @22}
    ];
    
    NSArray *sortedPeople = [people sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSNumber *age1 = obj1[@"age"];
        NSNumber *age2 = obj2[@"age"];
        return [age1 compare:age2];
    }];
    
    NSLog(@"按年龄排序:");
    [sortedPeople enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"  %@ - %@岁", obj[@"name"], obj[@"age"]);
    }];
}

3.4 实际应用示例

复制代码
// 实际应用:用户数据管理器
@interface UserDataManager : NSObject

typedef void (^DataCompletion)(NSArray *users, NSError *error);
typedef void (^UserAction)(NSDictionary *user);

- (void)fetchUsersWithCompletion:(DataCompletion)completion;
- (void)processUserWithID:(NSString *)userId action:(UserAction)action;

@end

@implementation UserDataManager

- (void)fetchUsersWithCompletion:(DataCompletion)completion {
    // 模拟网络请求
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 模拟数据处理
        [NSThread sleepForTimeInterval:0.5];
        
        NSArray *users = @[
            @{@"id": @"1", @"name": @"张三", @"email": @"zhangsan@example.com"},
            @{@"id": @"2", @"name": @"李四", @"email": @"lisi@example.com"},
            @{@"id": @"3", @"name": @"王五", @"email": @"wangwu@example.com"}
        ];
        
        // 回到主线程回调
        dispatch_async(dispatch_get_main_queue(), ^{
            if (completion) {
                completion(users, nil);
            }
        });
    });
}

- (void)processUserWithID:(NSString *)userId action:(UserAction)action {
    NSDictionary *user = @{@"id": userId, @"name": @"示例用户", @"status": @"active"};
    
    // 执行传入的块
    if (action) {
        action(user);
    }
}

@end

void demonstrateRealWorldExample() {
    NSLog(@"========== 实际应用示例 ==========");
    
    UserDataManager *manager = [UserDataManager new];
    
    // 1. 使用块处理异步数据获取
    [manager fetchUsersWithCompletion:^(NSArray *users, NSError *error) {
        if (error) {
            NSLog(@"获取用户失败: %@", error.localizedDescription);
        } else {
            NSLog(@"获取到%lu个用户:", (unsigned long)users.count);
            [users enumerateObjectsUsingBlock:^(NSDictionary *user, NSUInteger idx, BOOL *stop) {
                NSLog(@"  %@ - %@", user[@"name"], user[@"email"]);
            }];
        }
    }];
    
    // 2. 传递自定义处理逻辑
    [manager processUserWithID:@"123" action:^(NSDictionary *user) {
        NSLog(@"处理用户: %@", user[@"name"]);
        // 这里可以执行任何自定义逻辑
    }];
}

// 主函数
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        demonstrateBasicTypes();
        demonstrateTypeConversion();
        demonstrateArrays();
        demonstrateDictionaries();
        demonstrateSets();
        demonstrateBasicBlocks();
        demonstrateBlockMemoryManagement();
        demonstrateAdvancedBlocks();
        demonstrateRealWorldExample();
    }
    return 0;
}

关键点总结

基本类型:
BOOL - Objective-C的布尔类型(YES/NO)

NSInteger/NSUInteger - 平台无关的整数类型

CGFloat - 图形相关的浮点类型

id/instancetype - 泛型对象类型

NSNumber - 基本类型的包装类

集合类:
NSArray/NSMutableArray - 有序集合,元素可重复

NSDictionary/NSMutableDictionary - 键值对集合

NSSet/NSMutableSet - 无序集合,元素唯一

NSCountedSet - 可计数的集合

代码块(Blocks)
语法:^返回值类型(参数列表) { 实现 }

特性:可捕获外部变量,可作为参数传递

内存:默认在栈上创建,使用copy可移动到堆

循环引用:使用__weak避免

应用:回调函数、异步操作、集合操作等

这些是Objective-C编程中最核心和常用的部分,熟练掌握它们对于iOS/macOS开发至关重要。

相关推荐
我命由我123452 小时前
Java 开发 - 含有 null 值字段的对象排序(自定义 Comparator、使用 Comparator、使用 Stream API)
java·开发语言·学习·java-ee·intellij-idea·学习方法·intellij idea
代码s贝多芬的音符2 小时前
IOS webview打开相机 相册 选择文件上传
数码相机·ios
聆风吟º2 小时前
【C++藏宝阁】C++介绍:从发展历程到现代应用
开发语言·c++·应用领域·发展历程·起源
运维闲章印时光2 小时前
单位本部与分部网络已实现互联互通,网络访问通畅,数据传输正常
开发语言·网络·php
艾莉丝努力练剑2 小时前
艾莉丝努力练剑的2025年度总结
java·大数据·linux·开发语言·c++·人工智能·python
枫叶丹44 小时前
【Qt开发】Qt系统(一)-> 定时器 QTimerEvent 和 QTimer
c语言·开发语言·数据库·c++·qt·系统架构
我居然是兔子10 小时前
异常练习:在试错中吃透Java异常处理的底层逻辑
java·开发语言
养一回月亮!10 小时前
使用Qt实现简单绘图板:鼠标绘制与擦除功能详解
开发语言·qt
BanyeBirth10 小时前
C++差分数组(二维)
开发语言·c++·算法