如何在MacOS上获取更新的时区标识符(Objective-C实现)
MacOS下通过Objective-C获取自动更新时区标识符(Go调用示例)
1. Objective-C实现代码
创建tzhelper.m文件,内容如下:
#import <Foundation/Foundation.h> // 暴露给Go调用的C风格函数 const char* GetAutoUpdatingTimeZoneIdentifier() { // 获取自动更新的当前时区对象 NSTimeZone *autoTZ = [NSTimeZone autoupdatingCurrentTimeZone]; // 获取时区标识符字符串 NSString *identifier = [autoTZ identifier]; // 将NSString转为C字符串,返回拷贝后的内容(避免原对象释放后指针失效) return strdup([identifier UTF8String]); } // 用于释放返回的C字符串,避免内存泄漏 void FreeTimeZoneIdentifier(const char* str) { free((void*)str); }
2. Go调用代码示例
在Go文件中通过cgo调用上述函数:
package main /* #cgo LDFLAGS: -framework Foundation #include "tzhelper.m" */ import "C" import "fmt" import "unsafe" func main() { // 调用Objective-C实现的函数获取时区标识符 cStr := C.GetAutoUpdatingTimeZoneIdentifier() defer C.FreeTimeZoneIdentifier(cStr) // 记得释放内存 // 转为Go字符串 tzID := C.GoString(cStr) fmt.Println("自动更新的时区标识符:", tzID) }
关键说明
- Swift里的
autoupdatingCurrent属性,在Objective-C中对应的调用是类方法[NSTimeZone autoupdatingCurrentTimeZone] - 必须用
strdup拷贝C字符串,因为UTF8String返回的指针属于NSString内部存储,对象释放后指针会失效 - 通过
#cgo LDFLAGS: -framework Foundation指定编译时链接Foundation框架,这是调用系统API的必要条件 - 一定要调用
FreeTimeZoneIdentifier释放内存,避免长期运行出现内存泄漏
内容的提问来源于stack exchange,提问作者kortschak
相关产品推荐
相关产品推荐

