我正在编写一个多 View 应用程序,它利用一个名为 RootViewController 的类在 View 之间切换。
在我的 MyAppDelegate header 中,我创建了一个名为 rootViewController 的 RootViewController 实例。我见过这样的例子,其中@class 指令被用作“前向类声明”,但我不太确定这意味着什么或完成了什么。
#import <UIKit/UIKit.h>
@class RootViewController;
@interface MyAppDelegate
.
.
.
最佳答案
它基本上告诉编译器类 RootViewController 存在,但没有具体说明它的样子(即:它的方法、属性等)。您可以使用它来编写包含 RootViewController 成员变量的代码,而无需包含完整的类声明。
这在解决循环依赖时特别有用 - 例如,假设 ClassA 有一个 ClassB* 类型的成员,而 ClassB 有ClassA* 类型的成员。您需要声明 ClassB 才能在 ClassA 中使用它,但您还需要声明 ClassA 才能在 中使用它B 类。前向声明允许您通过告诉 ClassA ClassB 存在来克服这个问题,而无需实际指定 ClassB 的 完整规范。
您倾向于发现大量前向声明的另一个原因是有些人采用前向声明类的约定,除非它们绝对必须包含完整的声明。我不完全记得,但这可能是 Apple 在其 Objective-C 指导风格指南中推荐的内容。
继续我上面的例子,如果您的 ClassA 和 ClassB 声明在文件 ClassA.h 和 ClassB.h 分别,你需要 #import 任何一个在另一个类中使用它的声明。使用前向声明意味着您不需要 #import,这会使代码更漂亮(特别是当您开始收集相当多的类时,每个类都需要在使用它的地方使用 `#import),并通过最大限度地减少编译器在编译任何给定文件时需要考虑的代码量来提高编译性能。
顺便说一句,虽然这个问题只与 Objective-C 中的前向声明有关,但所有后续评论也同样适用于 C 和 C++(可能还有许多其他语言)的编码,它们也支持前向声明并通常使用出于同样的目的。
关于Objective-C:前向类声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5191487/
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
我有一个ruby程序,我想接受用户创建的方法,并使用该名称创建一个新方法。我试过这个:defmethod_missing(meth,*args,&block)name=meth.to_sclass我收到以下错误:`define_method':interningemptystring(ArgumentError)in'method_missing'有什么想法吗?谢谢。编辑:我以不同的方式让它工作,但我仍然很好奇如何以这种方式做到这一点。这是我的代码:defmethod_missing(meth,*args,&block)Adder.class_evaldodefine_method
我正在为ruby开发一个C扩展,但我需要包含来自IOBluetooth框架的header,特别是:#import#import一切都编译正常,但在运行时,扩展错误:path/to/file.rb:1:in`require_relative':dlopen(/path/to/extension.bundle,9):Symbolnotfound:_OBJC_CLASS_$_IOBluetoothDeviceInquiry(LoadError)我相当确定这与未包含在链接过程中的框架有关,但我不确定原因。任何帮助将不胜感激extconf.rb:#Loadsmkmfwhichisusedto
在Ruby类定义中声明private/protected时实际发生了什么?他们不是keywords,这意味着它们必须是方法调用,但我找不到它们的定义位置。它们似乎没有记录在案。声明private/protected方法(如下所示)的两种不同实现方式是否不同?(第二种方式显然是方法调用,但在第一种方式中并不那么明显。)classFooprivatedefi_am_private;enddefso_am_i;endendclassFoodefi_am_private;enddefso_am_i;endprivate:i_am_private,:so_am_iend
这个问题在这里已经有了答案:Ruby(andRails)nestedmodulesyntax(4个答案)关闭2年前。做和做有什么区别吗classBus::Driverend和moduleBusclassDriverendend如果不是,首选哪种语法?
这是一个关于包含.rb文件的初级问题。我想访问在另一个rb文件中声明的数组。我的主程序是这样的:#!/usr/bin/envrubyload'price.rb'[...]max_price=price[az][type]*2[...]这是price.rb:price={'us-east-1'=>{'t1.micro'=>0.02,'m1.small'=>0.08,'c1.medium'=>0.165,'m1.large'=>0.320},'us-west-1'=>{'t1.micro'=>0.02,'m1.small'=>0.08,'c1.medium'=>0.165,'m1.larg
我最近一直在学习ruby,并且基本上爱上了||=特性,因为它可以使在ObjectiveC中编写惰性getter变得更加容易。目前我写的getter如下:-(NSArray*)myArray{if(!_myArray){_myArray=[NSArrayarray];}return_myArray}除非我遗漏了||=的某些内容,否则我将能够使用Ruby编写以前的代码:-(NSArray*)myArray{return_myArray||=[NSArrayarray];}那显然更干净了。Objective-C语言/运行时中是否有任何东西可以让您做到这一点?此外,以下是getter的单行
acts_as_taggable_on实现效果很好,但我还需要声明标签别名。我找到了一个声称这样做的插件,acts_as_taggable_with_aliases,但最后一次提交是在2009年并且不在gem存储库中,所以我认为该项目现在已经死了。有什么办法可以实现吗? 最佳答案 也许你可以创建自己的模型来支持这个(以及你想要的任何其他东西)......我认为您可以通过执行以下操作来实现:classTagtrueendclassModelIWantToBeTagged:taggableendmoduleModelTaggingdef
我没有Mac或iPhone。然而,采用C并使其更加动态地朝着smalltalk、python或ruby的想法发展的概念对我来说确实很有吸引力。我很乐意从Objective-C开始。Objective-C只是C的语法超集还是真的像C。比如,它可以用gcc等编译吗?我的大部分编程都是用Ruby完成的。ObjectiveC似乎比C宽容得多。您可以在C中为Ruby编写native扩展。您可以在ObjectiveC中为Ruby编写native扩展吗?除了拥有Mac/iPhone和XCode之外,我如何开始使用ObjectiveC? 最佳答案