【问题标题】:How do initializations of C structs work in iOS's Objective-C?C 结构的初始化如何在 iOS 的 Objective-C 中工作?
【发布时间】:2013-09-23 17:57:09
【问题描述】:

来自https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGGeometry/Reference/reference.html#//apple_ref/doc/c_ref/CGSize

struct CGSize {
   CGFloat width;
   CGFloat height;
};
typedef struct CGSize CGSize;

CGSize 是一个朴素的 C 结构,不接受消息。

(在我的情况下)创建尺寸为 0 的 CGsize 的适当方法是什么?

如果我直接使用 C,那将是 calloc() 或诸如此类的用例。这个用例的 Objective-C 习惯用法是什么?

【问题讨论】:

  • 嗯,Objective-C 是 C 的超集,你可以使用calloc()。但是你确定你需要动态内存分配吗?为什么不使用预定义常量CGSizeZero?还是CGSize sz = { 0, 0 };?还是CGSize sz = CGSizeMake(0, 0);?还是(CGSize){ 0, 0 }
  • @H2CO3,通常解决问题最糟糕的方法是,例如,按照 COBOL 中的工作方式构建、解决并几乎构建解决方案,然后尽你所能来实现解决方案在 Python 的语法中。任何可以在 C 中运行的东西在 Objective-C 中运行,但是编写一个使用 Python 的 Python 解决方案和编写一个使用 COBOL 的 Python 解决方案之间有很大的不同。
  • @JonathanHayward 除了 COBOL 不是 Python 的严格超集,但 Objective-C 是 C 的严格超集。它只是 C 之上的一个薄层,增加了一些 OO,没有别的,而且- 正如你刚刚经历的那样 - 你不能(也不应该)试图“客观化”那些简单的 C 语言。另外,不要教我设计。

标签: iphone ios objective-c c ipad


【解决方案1】:

你可以使用的具体情况

CGSize zeroSize = CGSizeZero;
CGSize zeroSize = (CGSize){ 0, 0 };
CGSize zeroSize = (CGSize){ .width = 0, .height = 0 };
CGSize zeroSize = CGSizeMake(0,0);

请记住,许多情况下,Core Graphics 和 Core Foundation 等框架为您提供了可以使用的常量,例如 CGSizeZero,因此您通常不需要使用 calloc 动态初始化此类结构。

【讨论】:

    【解决方案2】:

    在两个维度上获得 0 的最简单方法是常量 CGSizeZero

    另一种方式是CGSizeMake(0,0)

    【讨论】:

    • 谢谢;通常有常量和工厂函数来创建纯粹的、朴素的 C 结构吗?
    • @JonathanHayward 一般?在什么意义上?
    • @H2CO3,在“我首先要考虑实例化结构体的地方吗?例如 picciano 给出的某个工厂(或常量)?”
    • 很多有 CGFooZero,其中 Foo 是结构类型。
    • @JonathanHayward 在这种情况下,是的。但不幸的是,你不会总能找到一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多