- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在使用 iOS6 beta 3 时注意到了这一点
当我创建 UIViewContoller 的新子类时(没有其他父类生成我注意到的这种行为),.m 文件现在在文件顶部有一个空类别。在过去学习类别时,我注意到有些人会使用相同的技术来指示私有(private)方法(尽管不是真正的私有(private)方法)。
这就是这里的意图吗?现在让事情真正私有(private)化有什么变化吗?我也注意到那里的@private 指令。
关于私有(private)变量和方法,您的个人编码风格是什么?
更新:由于 XCode 插入我们使用类扩展,我继续将它们用于该项目的私有(private)方法/ivar。我发现了一个缺点。我看到我可以重用我的子类 UIViewControllers 之一以及所有它的 UIButtons、UILabels 等......我有这个继承:UIViewController <- FirstViewController <- SecondViewController.
好吧,当我在 SecondViewController 中编写代码时,我放入 FirstViewController 的类扩展中的所有私有(private)方法都不会在自动完成中弹出。有点烦....
最佳答案
你指的是这个接口(interface)定义:
@interface MYViewController ()
@end
从技术上讲,这是一个类扩展,而不是一个类别。类别在括号内有一个字符串。类扩展在编译时添加到类中,因此可以添加 ivars(通常以属性的形式)。类别在运行时添加,不能添加 ivars。
综上所述,您的观点是正确的。这用于定义私有(private)方法和属性。
在 ObjC 的世界里,“私有(private)”是一个“禁止侵入”的标志,而不是铁丝网墙。虽然有一个 @private
关键字(增加了编译器执行),但它只适用于 ivars,通常不是必需的。这种基于警告的隐私在 ObjC 中非常有效并且已经足够了。
将您的私有(private)属性放在此类扩展中,如果外部调用者尝试访问它们,他们将收到“可能不会响应选择器”警告(就像他们调用任何未定义的方法一样)。您永远不应允许 ObjC 项目中存在警告,因此这会强制执行数据封装。
编辑
如果它们是私有(private)的,那么它们不应该出现在您的子类中。你想要的是 protected 。 ObjC 中的 protected 方法没有很好的方案,但一种常见的技术是将它们放入 .h 文件中的类别,如 MYViewController+Protected.h。我发现这在实践中很少出现,因为很多好的 ObjC 设计都没有子类化。它改用组合和委托(delegate)。
关于“为什么只查看 Controller ”。首先,它不仅仅是 View Controller 。它只是 iOS 上的 View Controller (好吧,VC、TableViewController 和 GLKViewController)。在 Mac 上,它也是窗口 Controller 和聚光灯导入器。查看:
.../Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates
.../Library/Xcode/Templates
但为什么会这样?好吧,这些都是 Controller , Controller 需要私有(private)属性是非常普遍的。事实上,如果您在 Controller 中没有私有(private)属性,您可能会公开太多。这不是通用的模型和 View 类。我怀疑这影响了他们的决定。也可能是不同的人拥有这些模板,或者它们是在不同的时间更新的。有时您会看到一些小的不一致,这些不一致会随着时间的推移而逐渐消除。
您也可以制作自己的模板。参见 Creating Custom Xcode 4 File Templates .
关于objective-c - Xcode 现在生成一个空类别。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11679885/
我似乎无法让它发挥作用。我已经尝试过在线样本,但没有一个正是我需要的。基本上我希望能够显示从给定日期过去的天数。我下面的示例是 HTML 和 PHP 的组合,出于某些原因我不得不这样做。 Date
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
在此处搜索“线程关联”的答案,我发现人们对此很感兴趣,但没有什么理由可以节省可能获得稳定的 QueryPerformanceTimer 结果。 假设一个现代操作系统和一个现代 2-4 插槽工作站/服务
我有一个称为main-app的聚合物元素:
我有一个表,我想在每个插入时间记录每个订单的时间戳。但是,我得到的时间戳值为零。 这是我的架构: CREATE TABLE IF NOT EXISTS orders( orde
我正在使用 MongoDB Atlas 来托管数据库并使用这个无服务器函数查询数据: import { NextApiRequest, NextApiResponse } from "next"; /
苹果卸下了转义键,并用OLED触摸条替换了它。这对emacs用户具有影响,特别是对于具有数十年肌肉内存力才能克服此变化的UNIX/emacs用户而言。幸运的是,触摸栏逃生键似乎总是在您需要的时候出现,
抱歉,我对 DbGrids 还很陌生。 我是否应该使用查询的字段编辑器并以某种方式添加一个捕获 TIMEDIFF 的新字段,然后将其添加为我的 DbGrid 中的列? 或者我可以/应该跳过字段编辑器并
正如一本相当古老的书XUnit Patterns所写,NUnit 2.0不会为每个测试创建新的测试夹具,因此,如果测试正在操纵夹具的某种状态,则该夹具会被共享并且可能导致各种不良副作用。 还是一样吗?
我知道自2016年4月以来,Youtube API的默认配额限制为1M。 如果要增加它,我们需要向Google 发送请求。 我想知道我们可以要求的配额限制的最大值是多少? 最佳答案 根据Google开
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
{ "size": 0, "query": { "range": { "LogTime": { "gte": "now-1d",
当我尝试从终端编译这个简单的代码时: #include int main(void) { printf("%f\n",sqrt(10)); return 0; } 使用 gcc mai
我正在尝试筛选抓取一个 html 页面,以便我可以从中提取所需的有值(value)的数据并将其放入文本文件中。到目前为止,一切进展顺利,直到我在 html 页面中遇到了这个: In inventor
这是我的 结果 MySQL 表的示例: 我想将特定用户的所有日期向前移动相同的时间间隔,以便该用户的最高日期是当前时间戳。我知道如何获取以天为单位的间隔: /* result is 823 */ SE
我有一个函数需要从主视图中的几个不同位置调用。我们称它为 updateFunction。 我这样声明: - (void)updateFunction { //updates some vari
我正在尝试找出如何以某种方式嵌套回调。 var alpha = function(callback){ var x = 5; if(x > 2){ callback()
为什么我收到RangeError:超出最大调用堆栈错误?我正在尝试解析文本以找到数学并解决它。它一直有效,直到我开始实现括号'。我试图找出错误,但就是无法弄清楚。 我的代码: var alg = {
我记得几年前,没有使用 SSL 的原因之一是它占用了大量资源,因此影响了应用程序的性能。 如今,以当前的技术,这仍然是一个需要牢记的点吗? 这个问题的出现是因为一位同事担心使用 SSL 会影响他的应用
我正在将我的数据库从 sqlserver 迁移到 mysql当我在 sqlserver 中使用 getDate() 函数时,mysql 中的替换是 Now()但是 Now() 没有返回 getDate
我是一名优秀的程序员,十分优秀!