问题标签 [designated-initializer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
93 浏览

objective-c - 指定初始化器和传递参数

我有这个层次结构:

在 CreateAnObjectClass 中,我想创建一个 MySecondClass 方法的实例,并且我想将 a 传递@property (strong,nonatomic) NSDictionary* myTemplate给 myBaseClass。

例如:

而且我知道从 MyBaseClass 和 MySecondClass 调用这两个初始化程序。

我的问题是我应该如何将 myTamplate 的初始化程序设计为 MyBaseClass 的属性?

0 投票
1 回答
5986 浏览

ios - loadNibNamed 与 initWithFrame 两难设置框架的高度和宽度

我创建了一个与 .xib 文件关联的 UIView 子类。此 UIView 子类将在 UIViewController 中使用。在控制器中,我认为我们如何实例化 UIView 子类有两种选择:

我更喜欢允许我执行自定义初始化的第一种方法或其变体。唯一的问题是我必须指定一个框架的矩形,它已经在 . xib(我的意思是框架的高度和宽度MyUIView)。是的,我可以在 中再次对其进行硬编码aRect,但这维护起来很繁琐(例如,当我在 .xib 中更改 UI 的位置时,我也必须更新aRect)。

因此,应该考虑第二种方法,因为框架矩形是自动设置的。剩下的问题是我无法自定义初始化程序(例如,我想在初始化期间传递额外的参数)。

你的偏好是什么?你认为哪一个更好?

EDIT1:受塞尔吉奥回答的启发,我想出了这个解决方法:

0 投票
1 回答
197 浏览

objective-c - 在指定的初始化程序中初始化实例对象?

我有一个具有宽度和高度属性的 Rectangle 类。它还有一个名为origin (-(XYPoint *) origin ) 的实例属性/对象。下面是我指定初始化程序的代码,其中我将 XYPoint 对象作为参数传递。如果我将 XYPoint 类的属性作为此方法中的参数,然后初始化 XYPoint 对象并在方法内为其分配内存,有没有办法(或者可以)?否则,我必须在我的主程序中创建一个 XYPoint 对象并将其作为参数传递,这需要输入更多代码。

PS-我是编程和Objective C的新手,所以如果我在我的问题中陈述了技术上的错误,请原谅我。谢谢!

0 投票
1 回答
291 浏览

objective-c - 在 Objective-C 中,指定初始化程序总是被调用的规则并不总是被遵守?

我们能否相信在 Objective-C 中,规则是类的指定初始化程序总是被确定调用?或者我们可以说,它应该几乎总是正确的,除了几个例外?例如,对于UIView文档说:

初始化框架:

如果您以编程方式创建视图对象,则此方法是 UIView 类的指定初始化程序。子类可以重写此方法以执行任何自定义初始化,但必须在其实现开始时调用 super。

如果您使用 Interface Builder 来设计您的界面,那么当您的视图对象随后从 nib 文件加载时,不会调用此方法。nib 文件中的对象被重构,然后使用它们的 initWithCoder: 方法进行初始化

或者我们可以说,如果是以编程方式,则规则应该始终适用于设计良好的类,但 Interface Builder 有点不同,因为它有点“复活”或以非编程方式构建对象。如果是这样,当我们进行 iOS 编程时,它们是否通常是其他例外?

0 投票
1 回答
1371 浏览

c - 使用 C99 进行 C 结构初始化 - 混合命名和未命名成员是否有效?

鉴于以下情况:

以下任何初始化语法在 C99 中是否有效?

语法示例 #1

语法示例 #2

我正在编写一个简单的结构解析器,在我的测试中,这不会导致使用 XCode 4.2 的编译器错误。我希望我的解析器符合 C99。我的理解(没有标准参考)是结构初始化程序应该具有所有未命名或命名(即指定)成员。

语法示例 #1 和 #2 应该是编译器错误吗?

如果示例有效,初始化语法的规则是什么?

更新的问题示例

在同一个主要问题中,示例三将如何工作?我主要对指定初始值设定项与标准初始值设定项的任意顺序感到困惑。

0 投票
2 回答
974 浏览

objective-c - Objective-C 类必须有一个指定的初始化器吗?

我在这个Apple's docs中找到了指定初始化程序的一些信息,但我不明白的是,每个类必须有一个且只有一个指定初始化程序吗?

例如, if class Ahas initL, initM, initN, whileclass B继承自class Aand has怎么办initX, initY, initZ。有没有一条规则说我们不能有initXcall [super initL], and initYcall [super initM], and initZcall [super initN]

也就是说,不是所有的“辅助初始化器”都调用指定初始化器,然后每个指定初始化器都会调用[super initFoo]initFoo类的指定初始化器,我们不能只有3个主初始化器,每个调用者对应的超类的3个主初始化器? (也就是说,这些都继承自NSObject并只是调用self = [super init]。)

0 投票
2 回答
494 浏览

c - 如何在 C99 中用另一个结构成员初始化 void* 数据结构成员?

假设我们有以下结构定义:

和以下初始化:

现在的问题,您能否告诉我如何void* data使用指定的初始化程序进行初始化,以便void* datadeepest_t deepest. 我试过这样的解决方案,但编译器尖叫它不是一个 const 值:

0 投票
2 回答
1437 浏览

ios - (iOS) 自定义初始化 UIViewController 时黑屏

这是我在这里的第一个问题。我正在尝试制作一个适用于 Core Audio 的应用程序。我找到了我正在尝试使用的这个框架http://theamazingaudioengine.com/,到目前为止,我设法完成了文档中的第一件事,即播放文件。但是,通过在应用程序的委托中自定义初始化 UIViewController,我丢失了它的所有内容,并且视图控制器变黑,没有其他元素。

我的 UIViewController 只有一个按钮,我想用它来开始播放文件,但由于我无权访问它,目前,文件在项目构建时开始播放。

知道我在做什么错吗?

这是我的 appDelegate:

还有我的 UIViewController:

0 投票
2 回答
1216 浏览

c - C99 指定初始化程序重复索引在构建输出或 lint 中根本没有标记

前几天我玩了一下指定的初始化程序,令我惊讶的是,多次使用同一个索引是有效的。更重要的是,当我这样做时,它甚至没有产生编译器警告、错误甚至信息性声明,甚至 PC-Lint 似乎也不在乎(我认为这最让我感到惊讶)。

我想知道在这种情况下编译器是否有原因甚至不提供信息消息,或者是否有额外的编译器/lint/等。可用于捕获或标记此问题的选项。

使用的工具:Renesas RX Standard Toolchain v1.2.0.0 (C99)、gcc 版本 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)(在 VM 中)、Lint-NT 9.00i


例如,我正在处理的一些旧代码 #defines 一堆命令,然后创建一个命令结构数组(此处大大简化)以循环查找和使用该特定命令:

然后我想起了我在某处看到的指定初始化器语法,并认为除了检测重复的命令索引之外,它还可以为数组中项目的排列提供更大的灵活性,例如:

会产生与上面的初始代码相同的效果,但可以灵活地安排数组声明中的项目(它确实如此)和(我在想/希望)

至少会产生一个警告,因为我们不止一次地使用相同的指定索引(它没有)(这个例子很容易产生于添加一个命令而不移动最后一个 NULL 占位符)。


GCC Designated Inits页面记录了一个 GNU 扩展,它允许您在初始化程序中使用范围,我可以看到它对于定义整个范围然后覆盖某些部分的能力很有用(例如int arr[] = {[0 ... 99] = -1, [42] = 1},但我不明白为什么它仍然至少在某种程度上没有被标记...

在同一个 GCC 页面的更下方,它确实解决了多个字段的主题,但没有解释它为什么会这样:“如果同一个字段被多次初始化,它具有上次初始化的值。如果有的话这种重写的初始化有副作用,不确定是否发生副作用。目前,GCC 会丢弃它们并发出警告。

这个IBM页面也展示了一个有趣的例子,但仍然没有回答(至少对我来说)为什么它至少不是某种构建消息......

最后,这个2000 年 12 月的gcc 补丁页面表明重复检查已被明确删除,但没有(根据我简要阅读的内容)解释原因。

那么,为什么这(似乎)被掩盖了?有没有办法让编译器(甚至 lint)标记这个(以提供更多安全性)(在 c/c99 中;不要只说“使用 c++”或其他东西:p)?

0 投票
4 回答
4335 浏览

objective-c - 覆盖超类的指定初始化器

我正在读一本有指导方针的书:

“如果一个类声明了一个与其超类不同的指定初始化程序,则必须重写超类的指定初始化程序以调用新的指定初始化程序”

据我了解,这条准则换句话说是,如果我将我的类从它的超类中子类化,并且我的子类有一个指定的初始化器,它与 des 不同。它的超类的初始化程序,然后在我的子类中我必须覆盖我的超类的指定初始化程序,并在其中调用我的子类的指定初始化程序。

这是真的?我们必须一直这样做吗?谢谢你。