You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将二维C数组作为NSTimer的userInfo参数传递?

在Objective-C中通过NSTimer传递二维int数组的解决方案

你遇到的核心问题是NSTimer的userInfo仅接受Objective-C对象类型,无法直接传递C风格的二维int数组。以下是几种可行的解决办法:

方法一:用NSValue包装数组指针

NSValue可以包装C语言指针类型,以此将数组指针存入userInfo。需要注意修改回调方法的参数,先接收NSTimer对象,再从userInfo中取出数组。

示例代码:

// 回调方法
- (void)myTimer:(NSTimer *)timer {
    int (*field)[2][3] = (int (*)[2][3])[[timer userInfo] pointerValue];
    // 访问数组元素,例如(*field)[0][0]
    NSLog(@"数组元素:%d", (*field)[0][0]);
}

// 创建定时器
int Field[2][3];
memset(Field, 0x00, 6 * sizeof(int));
NSValue *arrayValue = [NSValue valueWithPointer:Field];
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(myTimer:) userInfo:arrayValue repeats:YES];

注意:如果Field是局部变量,要确保定时器周期内它的内存不会被释放,否则会出现野指针问题。若为局部变量,建议改用堆内存分配(如malloc),或选择下面的对象封装方法。

方法二:封装成自定义NSObject子类

创建一个简单类持有二维数组,直接将该类对象作为userInfo传递,更贴合Objective-C的编程风格。

自定义类实现:

// FieldHolder.h
#import <Foundation/Foundation.h>

@interface FieldHolder : NSObject
@property (nonatomic, assign) int field[2][3];
@end

// FieldHolder.m
#import "FieldHolder.h"

@implementation FieldHolder
@end

使用代码:

// 创建并初始化数组容器
FieldHolder *holder = [[FieldHolder alloc] init];
memset(holder.field, 0x00, 6 * sizeof(int));
holder.field[0][1] = 5; // 直接赋值数组元素

// 创建定时器
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(myTimerWithHolder:) userInfo:holder repeats:YES];

// 回调方法
- (void)myTimerWithHolder:(NSTimer *)timer {
    FieldHolder *holder = (FieldHolder *)timer.userInfo;
    NSLog(@"数组元素:%d", holder.field[0][1]);
}

方法三:使用实例变量/全局变量

如果二维数组是当前类的实例变量,回调方法中可直接访问,无需通过userInfo传递:

示例代码:

// 类扩展中声明实例变量
@interface YourClass () {
    int _field[2][3];
}
@end

@implementation YourClass

- (void)setupTimer {
    memset(_field, 0x00, 6 * sizeof(int));
    _field[1][2] = 10;
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(myTimer:) userInfo:nil repeats:YES];
}

- (void)myTimer:(NSTimer *)timer {
    // 直接访问实例变量
    NSLog(@"数组元素:%d", _field[1][2]);
}

@end

这种方法最简单,但如果数组需要多场景共享或存在多个类实例,需注意变量的作用域问题。

内容的提问来源于stack exchange,提问作者Jakob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:51:29