一些关于Objective-C的问题

3
我是一名实习生,正在学习Objective-C以开发iOS应用程序。他们已经有了现有的代码基础,但其中一些部分给了我很多麻烦。
由于之前的开发人员已经不在公司了,而且没有其他人了解Objective-C,因此没有人能够回答我的一些关于应用程序构建方式的问题,所以我无法确定是我自己理解有问题还是这只是一些不好的做法。
以下是我的一些问题:
1°)在一些类中,我发现了像这样的代码:
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated] }

这段代码是无用的,对吗?

2°) 在项目的大约9/10个方法中,它们返回void。在Obj-C中这是一种常见的做法吗(因为所有东西都是指针)?

3°) 有时候接口声明会同时出现在头文件和消息文件中。我猜这是因为你想在头文件中只声明一部分内容以备将来包含,并且有一个"私有"部分。但是在某个文件中,我发现了以下代码:

在头文件中:

@interface WebViewController : UIViewController
    @properties ...
@end

在Msg文件中:

#import ...
@interface WebViewController ()

@end

@implementation WebViewController ...

在msg文件中再次声明一个空接口有什么意义呢?

4°) 此外,在另一个类中,该接口也被第二次声明,但是一个方法被定义(在msg文件中)。由于该方法在下面已经定义,并且在头文件中没有声明,所以这样做的目的是什么呢?

提前感谢你。


这些都是一些非常基础的问题,只要稍微做点研究并在Stackoverflow上搜索就可以找到答案。你之前有做过任何研究吗? - Popeye
.m并不代表“message”,而是代表“实现”文件 ;) - nburk
第一项:在这样一个“无意义”的方法中设置断点非常容易,以便找出它何时被调用。这使得它非常有用。编写代码是为了使应用程序更容易调试,这在代码增长后非常重要。 - gnasher729
请阅读https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html,该文档将回答您所有的问题。 - Popeye
2个回答

4

欢迎来到Objective-C :)

  1. 不一定。超类可能在其自己的方法实现中定义了特定的行为,如果您不调用它,可能会导致问题。覆盖方法意味着默认情况下不会调用超类的方法。 从评论中添加:当然,如果您没有覆盖它,则超类定义将正常调用。您会发现它被覆盖的两个常见原因: a.它在Xcode模板中,因此一直存在并且未被删除 b.它曾经有其他内容,但已被删除,而方法调用留下。

  2. 是的。虽然您没有在方法中明确返回void,但您确实需要指定某些返回类型。如果您不返回任何内容,则void是正确的值。在obj-c类中通常找到它,因为该方法可能会响应通过改变内部ivar或属性调用而不需要返回。或者,结果可能是发送通知,因此不需要返回值。随着基于块的完成处理程序的使用越来越多,取代了显式值返回作为响应方法内容的方式。

  3. 是的,它是为了提供一个您不想公开的私有接口。在私有接口中没有任何内容的情况下,它可能是从Xcode的模板代码中获取的,并且没有人删除它。您可以忽略或删除。

  4. 对于您提到的具有方法的一个,虽然在接口中声明私有方法并不是必需的,但从编写可读代码的角度来看是有意义的(这是obj-c中强烈支持的概念)。由于编译器将删除任何不必要的代码,因此声明它并没有什么区别,并且当您或其他人稍后返回它时,使阅读代码和理解类变得更加容易。这也是将文档放在注释中的好地方,因为它将所有内容分组在一起。

希望这有所帮助。查看苹果的Objective-C编程指南以获取更多最佳实践提示。


我认为问题#1基本上是“当所有函数都调用父版本时,为什么要声明覆盖函数”。 - Peter M
@PeterM 是的,那就是我想说的 :) - DadEap Purple
对于第二个问题,我的问题更多是:在 obj-c 中,有很多方法返回 void 是常见的吗?例如,我在 Java 中编程了很多,这种情况很少见,大多数方法实际上都返回了一些东西。 - DadEap Purple
1
嘿,如果您除了调用父版本之外不需要执行任何操作,则可以完全不覆盖使用#1。声明它的常见原因有两个:它在模板中,因此一直存在且未被删除,或者它曾经有其他内容,但已被删除并留下了方法调用。关于#2,是的,我看到很多返回void的方法,因为通常会改变类属性/实例变量或触发通知而不是发送返回值。 - Cocoadelica
顺便说一句,这是个很好的问题,我喜欢那些让我们重新审视基本假设的问题。 - Cocoadelica
这是一个Objective-C的空类别,可用于私有声明。 - Rukshan

2

1). 是的,您可以删除此方法。

2). 它取决于您的要求,是否需要返回类型。例如:

- (BOOL)isEmptyOrNull:(NSString*)str;

3). 这些被称为扩展,您可以在此处阅读更多信息:http://rypress.com/tutorials/objective-c/categories.html

扩展用于隐藏方法,使其对外部世界不可见(我的意思是您无法通过眼睛找到这些方法)

4). 实现文件中定义的方法对程序员不可见,就像Java中的私有方法一样,但在ObjC中没有类似私有方法的东西。请阅读此线程以了解私有方法:Best way to define private methods for a class in Objective-C


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接