如何将二维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
相关产品推荐
相关产品推荐

