有人知道为什么在 XCode 模板中(至少在 XCode 4.3.2 中)有一些带有两个下划线的 ivars 前缀,而一些只有一个?
例如,Master-Detail 应用程序模板包含文件 MasterViewController.m,您可以在其中找到:
@synthesize detailViewController = _detailViewController;
@synthesize fetchedResultsController = __fetchedResultsController;
@synthesize managedObjectContext = __managedObjectContext;
谢谢。
最佳答案
这是一小 jar 蠕虫。
@synthesize中使用了下划线,主要是为了区分实例变量和访问器名称。这很重要,尤其是当您不仅仅访问访问器中的变量时(例如,惰性初始化)。如果它们是相同的名称,您可以轻松地键入“foo”并获取实例变量,而您的意思是调用访问器方法的“self.foo”。因此,这就是在该上下文中使用下划线的原因。
现在,Apple 表示我们不应该在私有(private)方法 名称中使用前导下划线。他们将这个约定用于他们的私有(private)方法名称,您可能会无意中覆盖其中一个基类方法。那会很糟糕,尤其是因为您无法在编译时捕获它。
但是,他们表示可以为私有(private)实例变量使用下划线。事实上,举个例子,他们说在合成属性时对 ivar 使用前导下划线是完全可以的(并建议)。
现在,问题来了。他们还对私有(private)实例变量使用单个前导下划线。所以,如果你有相同的名字,你可能会发生冲突。要看到这一点,在 View Controller 方法的实现中,他们会“_”并查看代码完成会抛出什么问题。
那么,为什么他们不反对这种命名做法呢?因为冲突是在编译时捕获的。不能有两个同名的实例变量。如果您尝试这样做,您将收到错误消息。
现在,为什么他们的代码模板会生成带有双下划线的名称?我不知道。 “实现”实际上保留了前导双下划线(后跟大写字母),但我们看到像 __block 这样的 ObjC 添加。
为了我的钱,我避免任何带有前导双下划线的东西。 Apple 可以在其生成的代码中做任何他们想做的事情。 FWIW,他们为 ARC 生成的一些代码仍然引用旧的非 ARC 关键字,所以我不会把他们生成的代码当作福音。 FWIW,我肯定不会不会保留他们为核心数据生成的代码。至少,您应该更改(在 managedObjectContext 访问器方法中):
__managedObjectContext = [[NSManagedObjectContext alloc] init];
到
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
顺便说一句,我看到人们使用美元符号作为他们的私有(private)合成名称的前导或尾随字符。
@synthesize foo = $foo;
@synthesize bar = bar$;
我已经编写 C/C++ 超过 25 年了,但我对 ObjC 还很陌生,它有其自身的复杂性。所以,我不是语言律师。我什至不是律师助理。我所知道的是它似乎是合法的 - 它适用于我尝试过的所有内容,但我不能肯定地说美元符号不应该用于其他用途。 Xcode 语法高亮器不喜欢它(它不会用变量名的其余部分给它着色)。
我希望这足以回答您的问题,尽管它可能只是促使您提出更多问题...
关于objective-c - XCode 模板中的 ivars 以一个或两个下划线为前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10258634/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?