【问题标题】:Pass and access structures using objective-c使用objective-c传递和访问结构
【发布时间】:2009-06-30 15:52:39
【问题描述】:

我想知道如何将结构传递给另一个函数,然后在被调用函数中访问该结构。我正在为 iPhone 开发,我使用结构的原因是我最终可以将数据作为结构传递给用 C 构建的服务器。

结构如下:

struct userInfo{
    NSString *firstName;
    NSString *lastName;
    NSString *username;
    NSString *email;
    NSString *ipAddress;
    double latitude;
    double longitude;
};

这里我只是获取一些用户输入的数据以及一些 CoreLocation 数据和 iPhone 的 IP 地址:

- (IBAction)joinButton {
    struct userInfo localUser;

    localUser.firstName = firstName.text;
    localUser.lastName = lastName.text;
    localUser.username = username.text;
    localUser.email = emailAddress.text;
    localUser.ipAddress = localIPAddress.text;
    localUser.latitude = currentLocation.coordinate.latitude;
    localUser.longitude = currentLocation.coordinate.longitude;

    [myNetworkConnection registerWithServer:&localUser];
}

处理结构的函数:

- (void)registerWithServer:(struct userInfo*)myUser {

    printf("First name is: %s", myUser.firstName);//error when compiling
}

编译器抛出此错误:request for member 'firstName' in something not a structure or union。当我尝试在第二个函数中访问它时,该结构是否超出范围?

【问题讨论】:

  • 没有理由将 Objective-C 对象放在结构中。不要这样做。要么创建一个对象来保存您的数据,将其放入 NSDictionary,要么将所有内容转换为原生 C 类型,例如 char* 用于您的结构。

标签: iphone c objective-c struct argument-passing


【解决方案1】:

您正在传递一个指向结构的指针。使用 -> 运算符,而不是点。

myUser->firstName

【讨论】:

  • 在控制台输出 8a,不是输入的字符串。
  • 那是因为它是 NSString,而不是 C 字符串 (char *)。您可以使用 cStringUsingEncoding:、getCString:maxLength:encoding: 或 UTF8String 方法获取带有 NSString 内容副本的 C 字符串。最后一个可能是最简单的: printf("%s\n", [myUser->firstName UTF8String]);
  • 要使用 printf() 输出 NSString,您必须将其转换为 char* 并使用 %s 格式说明符。但是,您可以将 %@ 与 NSLog 或您自己的变体一起使用。 cocoaheads.byu.edu/wiki/a-different-nslog
  • 谢谢。我应该弄清楚那个。由于这些结构最终会被传递给服务器,我现在认为我应该使用 char 数组而不是 NSStrings 来定义结构。
  • 在这种情况下,您可能希望确保结构在客户端和服务器上对齐到相同的宽度。
【解决方案2】:

我不禁认为你真的应该把它做成一个适当的具有属性的 Objective-C 对象 - 做更多的工作,但它会表现得更好,并且生活在 NSObject 生态系统中。

【讨论】:

  • 对,它可能会做到这一点。但现在我想轻松地将结构从 iPhone 发送到远程服务器。我想将来这将是一个对象,我会将它的属性复制到一个结构中以推出。
  • 与其编写自定义 C 服务器,将构建在完全不同架构上的二进制结构与服务器代码分离,不如考虑构建一个简单的 REST 样式 Web 服务,在其中将新数据作为参数传递相反...从长远来看,这将使您的生活变得更加轻松。否则开始阅读字节序问题以及如何适应结构中不同的 int 大小......
猜你喜欢
  • 2021-05-11
  • 2011-02-14
  • 1970-01-01
  • 2012-07-29
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多