Objective-C iOS应用程序中的C风格函数[关闭]

Posted

技术标签:

【中文标题】Objective-C iOS应用程序中的C风格函数[关闭]【英文标题】:C-style functions in Objective-C iOS application [closed] 【发布时间】:2014-09-12 11:06:57 【问题描述】:

我们很多人都知道 - 我们可以在我们的 Objective-C ios 应用程序中使用 C 风格的函数,例如:

NSString* returnTen() 
    return @"Ten";

但是什么时候使用 C 风格的函数而不是常规的 Objective-C 方法是合理的呢?或者只是在一般情况下人们会在 iOS 应用程序中使用 C 风格的函数?

【问题讨论】:

如何定义 C 风格的函数?因为C既不定义NSString也不支持@""字符串。 在实现文件中,@implementation 指令上方 或在@实现中。效果也一样。 是的,没关系。但是无论如何使用它们有什么好处呢? 【参考方案1】:

但是什么时候使用 C 风格的函数而不是常规的 Objective-C 方法是合理的呢?

当您想要定义一个与对象及其数据无关的操作时,使用函数而不是类和方法是完全合理的。这样做有点与面向对象的编程风格对立,因此大多数人通常更愿意在可能的情况下使用类来做事,但如果适合你的情况,到处编写函数肯定不是不合理目的。

或者只是在一般情况下人们会在 iOS 应用程序中使用 C 风格的函数?

最明显的情况是当您使用提供函数的库或框架时。其中有很多。一些例子:

基于 C 的系统框架,例如 Core Foundation 和 Core Graphics POSIX/C 标准库 您碰巧需要的任何第三方 C 库

此外,考虑到块与函数非常相似,主要区别在于它们具有与之关联的状态。块在现代 Objective-C 中被广泛使用,并且在许多情况下,它们通过替换或避免委托方法等来简化 API。

【讨论】:

事实上,Objective-C API 希望您在某些情况下使用 C 函数。例如,NSArray 的 sortedArrayUsingFunction 方法将函数引用作为参数。 我会称它为 Foundation API,但是是的,绝对如此。而且我显然在这里分裂了头发 - 如果没有 Foundation,Obj-C 将不会很有趣。 我不知道该怎么称呼它——我不太擅长记住花哨的术语。 感谢您的回答 Caleb 和您的 cmets Hot Licks!【参考方案2】:

在 iOS 项目中使用所谓的“C 风格函数”并没有错。 Objective-C 是 C 的超集——所以在某种程度上,你一直在写 C。

通常,当函数的目的非常原子和/或当您想“内联”函数在其余代码中所做的事情时,您将有资格使用纯 C 函数。例如,您可能需要一个计算两个给定整数中最大的一个的函数。因为这是一件非常“小”的事情,而且不值得发送完整的 Objective-C 消息(在幕后需要使用 objc_msgSend() 才能工作)的开销(诚然很小),你可以将其实现为一个小的 C 函数。所以,而不是

- (int)biggerIntegerOf:(int)a and:(int)b 
    return a > b ? a : b;

你可以使用

static inline int max(int a, int b) 
    return a > b ? a : b;

通过指定“内联”,您可以向编译器提示“在我的代码中调用函数 max() 的位置,您可以将其内容直接内联,就像我复制并贴在那里”。

【讨论】:

很好的答案,谢谢 Elwisz。但是如果我想从那个小函数 NSString 中返回呢? 没有什么可以阻止你这样做。请记住,您实际上并没有返回 NSString,而是从函数中返回指向 NSString 的指针。所以用普通的 C 来做这件事真的没有什么特别的。

以上是关于Objective-C iOS应用程序中的C风格函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Objective-C 很难

Objective-c 中的条件注释标签

如何在 iOS 上使用 Objective-C 触发按需 ***

搞懂Objective-C中的autorelease

iOS开发CoreGraphics核心图形框架之一——CGPath的应用

iOS:开源 VoIP/SIP Objective-C 代码 [关闭]