Tag: objective c

麻烦发现内存泄漏cStringUsingEncoding

嘿,我试图使用cStringUsingEncoding将NSString转换为C字符串,但我有内存泄漏。 我的理解是cStringUsingEncoding返回一个指向字符数组的指针,该字符数组只保证在NSString对象的持续时间内存在。 因此,您应该将其内容复制到另一个字符串。 这就是我的问题所在…… 我有一个函数接受NSString并将其转换为C字符串副本。 仅仅为了测试,我运行了以下方法的1000次迭代(以确保没有泄漏)。 -(void)test{ NSString *test = [[NSString alloc] initWithString:@”Hello world!”]; for(int i=0; i<1000; i++) { char *tmp = [self returnCopiedCString:test]; //free memory free(tmp); } [test release]; } 相当直接的代码……问题是它像疯了一样泄漏。 现在在你得出结论之前我的returnCopiedCString函数工作得很好。 我通过声明和复制C字符串来测试它,以排除这是一个问题的可能性。 在函数内部我使用以下代码进行转换 -(char *)returnCopiedCString:(NSString *)input{ //retain input [input retain]; //get length of encoded C-string int len = [input lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; //allocate memory for […]

memcpy导致EXC_BAD_ACCESS

我正在将别人的C ++转换为(Objective)C,但我遇到了memcpy的问题。 我用它如下: memcpy((void *)virtualFlash[virtualFlashAddress], data, dataLength); 变量定义如下: unsigned char virtualFlash[5 * 1024 * 1024]; // 5MB NSUInteger virtualFlashAddress; // set to 8 later on unsigned char *data = (unsigned char *)[recordData bytes]; // recordData is an NSData object NSUInteger dataLength = [recordData length]; // same NSData object 我在memcpy的行上得到一个EXC_BAD_ACCESS。 我调试了recordData ,返回 ,dataLength返回16 – 两者都正确。 memcpy((void*)virtualFlash[8], […]

地板加倍数小数点

我希望将其小数位于可变小数位的二进制位置(在iphone sdk中)。 这里有一些例子向你展示我的意思 NSLog(@”%f”,[self floorMyNumber:34.52462 toPlace:2); // should return 34.52 NSLog(@”%f”,[self floorMyNumber:34.52662 toPlace:2); // should return 34.52 NSLog(@”%f”,[self floorMyNumber:34.52432 toPlace:3); // should return 34.524 NSLog(@”%f”,[self floorMyNumber:34.52462 toPlace:3); // should return 34.524 NSLog(@”%f”,[self floorMyNumber:34.12462 toPlace:0); // should return 34.0 NSLog(@”%f”,[self floorMyNumber:34.92462 toPlace:0); // should return 34.0 任何想法如何做到这一点? 解 -(double)floorNumberByDecimalPlace:(float)number place:(int)place { return (double)((unsigned int)(number * (double)pow(10.0,(double)place))) […]

如何定义未指定大小的C数组,作为Objective-C中的实例变量

在Objective-C中,如何将“未知大小”的C数组定义为实例变量,然后填充数组? (背景) :我在Objective-C中有一个类来处理加载游戏数据。 数据存储在C结构数组中,包含在外部数据文件中。 我可以加载数组并访问它,但我需要它可以在整个类中访问。 我要做的是在我的实例变量中声明一个’empty’数组然后(加载时)指向这个空数组或用我加载的数组替换它。 这就是我在我的数据中加载的方式…… FILE *fptr = NULL; fptr = fopen([path cStringUsingEncoding:NSUTF8StringEncoding], “r”); // Create an empty array of structs for the input file with known size frame2d newAnimationData[28]; // Read in array of structs fread(&newAnimationData, sizeof(newAnimationData), 1, fptr); fclose(fptr); 所以这段代码可以很好地重新创建我的frame2d结构数组 – 我只需要知道如何将它用作实例变量。 任何帮助表示赞赏,谢谢。

将长64位十进制转换为二进制

好吧,虽然我仍然遇到问题,但我想要完成的事情相当简单。 这是我的代码: – (NSString*)toBin:(long)dec { long num = dec; NSString *res = [NSString string]; for (long i=63; i>=0; i–) { long div = 1<<i; if ((num&div)==div) res = [res stringByAppendingString:@"1"]; else res = [res stringByAppendingString:@"0"]; } return res; } 这就是我测试它的方式: for (long i=1; i<10; i++) { NSLog(@"%u = %@",i,[self toBin:(long)i]); } 但是,上面的输出是: 1 = 0000000000000000000000000000000100000000000000000000000000000001 […]

OpenSSL x509证书:使用X509_add1_ext_i2d()添加扩展名

语境: 我正在使用OpenSSL中的API生成x509证书。 我首先创建这样的X509结构: X509 *x509 = X509_new(); // Assume no errors 我想做什么: 现在我想为此证书添加扩展名。 具体来说,我想将“扩展密钥用法”扩展名设置为值serverAuth,clientAuth 。 为此,我尝试使用具有以下签名的OpenSSL函数x509_add1_ext_i2d() : X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, unsigned long flags) 我正在调用该函数传递一个C字符串的value ,我认为这是不正确的。 这是我正在制作的电话: X509_add1_ext_i2d(x509, NID_ext_key_usage, “serverAuth,clientAuth”, 0, 0) 发生了什么: 当该行代码运行时,我得到一个EXC_BAD_ACCESS (code=EXC_i386_GPFLT)exception。 我假设那是因为我传入的value必须是某种特殊的东西(一个八位字符串?某种其他的OpenSSL值?) 我需要的: 为了正确地将该扩展名设置为字符串值serverAuth,clientAuth我需要为value参数传递什么? 或者,或者,为什么我得到列出的例外? 注意:如果我删除此行并尝试生成没有扩展名的证书(其他属性,如名称,到期日期等,我为了简洁而在此处排除),它可以正常工作。 我花了一整天的时间来倾听OpenSSL(荒谬可怜)的文档和谷歌搜索。 我能找到的所有内容都讨论了如何从命令行而不是代码中添加证书扩展。 我无法追踪这个函数期望在value参数中看到的内容。

没有相机可以使用Vuforia吗?

是否可以在没有相机的情况下使用Vuforia进行图像跟踪? 基本上我想要一个函数,我可以调用图像作为indata参数和图像目标的坐标作为结果。 那存在吗?

有没有办法从varargs函数的参数中检索浮点数?

如果函数是用原型定义的,该原型明确说明了参数的类型,例如。 void somefunc(int arg1, float arg2); 但实施为 void somefunc(int arg1, …) { … } 是否可以使用va_arg来检索浮点数? 它通常被禁止这样做,因为varargs函数具有隐式类型提升,例如float to double,因此尝试检索未启动类型是不受支持的,即使使用未启动类型调用函数对更具体的函数原型也是如此。 这样做的原因是在运行时检索不同类型的参数,作为obj-c解释器的一部分,其中一个函数将被重用于所有不同类型的方法。 这最好是独立于架构(因此,如果没有其他相同的代码在模拟器和设备上工作),尽管如果没有办法这样做,那么将接受设备特定的修复。 编辑:忘了特别提到:函数知道参数的类型和数量(它查找要使用SEL _cmd参数进行地图查找解释的代码)

在switch语句中使用Obj-C对象时出现奇怪的编译器错误

在switch语句中使用Objective-C对象时出现编译器错误: switch (myConstant) { case 0: UIViewController *myController = [[[UIViewController alloc] init] autorelease]; [self.navigationController pushViewController:myViewController animated:YES]; break; case 1: // stuff break; default: break; } 错误说明: ‘UIViewController’之前的预期表达式 ‘myViewController’未声明(首次在此函数中使用) 我理解第二个错误是第一个错误的直接结果,但我不明白为什么我首先得到’预期表达’错误… 如果我放一个; 在case 0:结尾case 0:行,然后它会编译,但我不应该这样做,不是吗? 这也将无法编译,具有相同的错误: switch (0) { case 0: int a = 0; break; default: break; } 但是,如果我声明int a; 在开关块外面,则a = 0; 编译好。 我以为我理解转换语句 – […]

IOS4 – 使用UDP套接字发送数据

我刚刚开始在iPhone上开发网络。 我需要开发一个简单的应用程序来与Wifi路由器交谈。 问题是,wifi盒通过UDP进行通信。 我已经挖了很多,但到目前为止我看过的所有示例代码都有TCP通信的例子,除了一个; UDPEcho示例。 所以,我的问题是:1。我如何知道WiFi网络上的设备是否可以通过WiFi连接? 2.为了在UDP上进行通信,我可以简单地创建一个套接字,并使用CFSocketSendData方法将数据发送到某个地址吗? 它看起来像UDPEcho示例,首先创建一个主机,然后解析它,然后获取一个地址,并在绑定到套接字后发送一些数据。 我想要一个简单的原始实现,只需发送数据包并接收数据包作为响应。 任何链接或参考都会有所帮助。 更有帮助的是,原始实现的一些基本步骤。 简单来说,我可以执行以下操作:1。使用CFSocketCreate创建套接字,在数据可供读取时指定回调。 2.使用CFSocketSend在套接字上发送数据,指定我要发送的地址。 编辑:我创建了一个类SocketTest,然后调用connect:后跟sendData。 这是代码: #include “SocketTest.h” @implementation SocketTest – (BOOL)connectSocket{ CFSocketRef appSocket; const CFSocketContext socketContext = { 0, self, NULL, NULL, NULL }; CFRunLoopSourceRef socketRunLoopSourceRef; struct sockaddr_in deviceAddress; /** We have to bind a machine address to the socket which we will create. For […]