标签: designated-initializer

我什么时候需要调用 - [UIViewController initWithNibName:bundle:]?

在post中使用initWithNibName绝对没有任何改变,他展示了两个使用相同的View Nib定义,在第一种情况下,他只是调用alloc/init而第二种,他指定了initWithNibName.

所以,虽然这总是有效的:

MyViewController *vctrlr = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; [self.navigationController pushViewController:vctrlr animated:YES]; [vctrlr release];

以下适用于我继承的所有View Controllers,但不是我的!

TheirViewController *vctrlr = [[TheirViewController alloc] init]; [self.navigationController pushViewController:vctrlr animated:YES]; [vctrlr release];

iOS编程新手,我继承了一些代码.所有View Controllers的视图都在IB中定义,但这些视图控制器的分配/初始化创建不一致.我创建了一个新的View Controller和XIB,但它不起作用,除非我使用initWithNibName(当我将视图控制器推到Nav Controller上时崩溃).我不知道我的视图控制器与其他控制器有什么不同...任何提示?我能够删除应用程序中除我的所有其他视图控制器的initNibName用法.

interface-builder uiviewcontroller designated-initializer ios

6
推荐指数
1
解决办法
2632
查看次数

-Wmissing-field-initializer 使用指定初始化程序时

我正在使用 GCC 4.6.2 (Mingw) 并使用-Wextra. 每当我使用指定的初始值设定项时,我都会收到奇怪的警告。对于以下代码

typedef struct
{
  int x;
  int y;
} struct1;

typedef struct
{
  int x;
  int y;
} struct2;

typedef struct
{
  struct1 s1;
  struct2 s2[4];

} bug_struct;

bug_struct bug_struct1 =
{
  .s1.x = 1,
  .s1.y = 2,

  .s2[0].x = 1,
  .s2[0].y = 2,

  .s2[1].x = 1,
  .s2[1].y = 2,

  .s2[2].x = 1,
  .s2[2].y = 2,

  .s2[3].x = 1,
  .s2[3].y = 2,
};
Run Code Online (Sandbox Code Playgroud)

我收到警告

bug.c:24:3: warning: missing initializer [-Wmissing-field-initializers]
bug.c:24:3: warning: (near initialization …
Run Code Online (Sandbox Code Playgroud)

c gcc c99 designated-initializer

5
推荐指数
1
解决办法
1183
查看次数

如何解决UITableViewController的指定初始化错误?

我是Swift的新手,在PlacesTableViewController类中声明初始化程序时遇到问题。它提示我“从初始化返回之前未调用Super.init”,当我添加Super.init时,它提示我:

“必须调用超类'UITableViewController'的指定初始化程序”

这是我的PlacesTableViewController.swift文件:

class PlacesTableViewController: UITableViewController { 

    var pa55DB : COpaquePointer = nil
    var selectStatement : COpaquePointer = nil;

    var chapterdata : Array<Entry> = []
    var ety : Entry
    var sqlString : String = "";

    var chpData : ChapterData

    init(pa55DB : COpaquePointer,selectStatement : COpaquePointer, chapterdata : Array<Entry>, ety : Entry, sqlString : String) {
        super.init()
        self.pa55DB = pa55DB
        self.selectStatement = selectStatement
        self.chapterdata = chapterdata
        self.ety = ety
        self.sqlString = sqlString

    }

    required init!(coder aDecoder: NSCoder!) {
        fatalError("init(coder:) has not been …
Run Code Online (Sandbox Code Playgroud)

initialization uitableview designated-initializer ios swift

5
推荐指数
2
解决办法
5891
查看次数

如何在Objective-C中标记超类"无效"的指定初始值设定项?

Adapting Modern Objective-C文档:

如果类提供一个或多个指定的初始值设定项,则它必须实现其超类的所有指定初始值设定项.

这意味着如果我有一个子类NSObject具有自己的指定初始化器,比如说

- (instancetype)initWithImage:(UIImage*)image NS_DESIGNATED_INITALIZER;
Run Code Online (Sandbox Code Playgroud)

那么我还需要提供NSObjects的实现-init.我应该怎么做才能将-init初始化程序标记为"无效",即没有人应该调用它而是使用它-initWithImage:?这里最好的做法是什么?

编辑

我尝试了这里描述的技术.

但是,当我在接口中标记超类-init方法时unavailable,编译器仍然告诉我需要覆盖超类的初始化器.

当我尝试其他技术,即引发异常或调用-doesNotRecognizeSelector:内部时-init,我收到一条错误,指出我需要调用我指定的初始化程序之一.

objective-c designated-initializer

5
推荐指数
0
解决办法
165
查看次数

使用指定的初始值设定项初始化结构中的2D字符串数组初始值设定项会在VS2013中发出错误C2078

我正在使用VS2013.整个程序是C,而不是C++.

我可以毫无问题地初始化这样的"字符串数组":

char titles[4][80] = { "Dad", "Idiot", "Donut Lover", "Fewl" }; // OK!
Run Code Online (Sandbox Code Playgroud)

我有一个像这样声明的结构:

typedef struct
{
    char name[80];
    char titles[4][80];
} Dude;
Run Code Online (Sandbox Code Playgroud)

当我尝试像这样初始化结构时:

Dude homer =
{
    .name = "Homer",
    .titles = { "Dad", "Idiot", "Donut Lover", "Fewl" } // error?
};
Run Code Online (Sandbox Code Playgroud)

我收到"错误C2078:初始化程序太多".这是因为数组初始化 - 如果我删除该.titles = { ...行,则错误消失.为什么我收到此错误?在struct初始化程序中是否有不同的方法来完成这种类型的字符串初始化?

如果我将结构的声明更改为这样

typedef struct
{
    char name[80];
    char *titles[4];
} Dude;
Run Code Online (Sandbox Code Playgroud)

错误消失了.然而,这不是我能做出的改变.代码库的其他部分要求此结构的大小正好是400字节.

此外,我很清楚我可以strcpy用来填写每个字段,但这不能回答我的问题.

c struct designated-initializer visual-studio visual-studio-2013

5
推荐指数
1
解决办法
317
查看次数

使用C99进行C struct初始化 - 将命名和未命名成员混合有效吗?

鉴于以下内容:

struct example_struct
{
  char c;
  int i;
};
Run Code Online (Sandbox Code Playgroud)

以下初始化程序语法在C99中是否有效?

语法示例#1

struct example_struct example = { 'a', .i = 1};
Run Code Online (Sandbox Code Playgroud)

语法示例#2

struct example_struct example = { .c = 'a', 1};
Run Code Online (Sandbox Code Playgroud)

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

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

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

更新的问题示例

struct example_struct_3
{
  char c;
  int i;
  float f;
};

struct example_struct_3 example = { .i = 1, 1.0};
Run Code Online (Sandbox Code Playgroud)

在同一个主要问题中,示例三如何工作?我主要对使用标准初始化器的指定初始化器的任意排序感到困惑.

c c99 designated-initializer

4
推荐指数
1
解决办法
1133
查看次数

用C语言评估语句

struct 
{
    int a[2], b;
} 
arr[] = {[0].a = {1}, [1].a = {2}, [0].b = 1, [1].b = 2};
Run Code Online (Sandbox Code Playgroud)

如何用C语言评估这一行?结构的一般声明与此声明不同.也访问C中的元素就可以做到像[0].a,[0].b像这样的?

c arrays initialization designated-initializer

4
推荐指数
1
解决办法
177
查看次数

深奥C指定初始化程序失败,编译器错误或功能?

我只花了大约凌晨1点追踪我的代码中的错误,我发现的确让我感到惊讶.实际代码非常复杂,涉及包含结构联合等的结构的联合,但我已经将问题提炼到以下简化的失败案例中.

发生的事情是编译器[gcc 5.4.0]正在改变指定初始值设定项的执行顺序,以匹配它们在结构中出现的顺序.只要使用不具有顺序依赖性的常量或变量初始化结构,这不会导致任何问题.请查看以下代码.它表明编译器清楚地重新排序指定的初始值设定项:

#include <stdio.h>

typedef const struct {
    const size_t First_setToOne;
    const size_t Second_setToThree;
    const size_t Third_setToTwo;
    const size_t Fourth_setToFour;
} MyConstStruct;

static void Broken(void)
{
    size_t i = 0;

    const MyConstStruct myConstStruct = {
        .First_setToOne     = ++i,
        .Third_setToTwo     = ++i,
        .Second_setToThree  = ++i,
        .Fourth_setToFour   = ++i,
    };

    printf("\nBroken:\n");
    printf("First_setToOne    should be 1, is %zd\n", myConstStruct.First_setToOne   );
    printf("Second_setToThree should be 3, is %zd\n", myConstStruct.Second_setToThree);
    printf("Third_setToTwo    should be 2, is %zd\n", myConstStruct.Third_setToTwo   );
    printf("Fourth_setToFour  should be 4, is %zd\n", myConstStruct.Fourth_setToFour …
Run Code Online (Sandbox Code Playgroud)

c struct initialization designated-initializer

4
推荐指数
1
解决办法
80
查看次数

为什么我不能将指定的初始化器与不是聚合的结构一起使用?

C++ 有一个不错的新特性:

struct Point{
int x;
int y;
int z; 
};

Point p{.x=47, .y=1701, .z=0};
Run Code Online (Sandbox Code Playgroud)

但是如果我添加一个构造函数,那么我将被禁止使用漂亮的指定初始化器语法:

struct Point{
Point(int x, int y, int z = 0): x(x), y(y), z(z){}
int x;
int y;
int z; 
};

static Point p{.x=47, .y=1701, .z = 0};
Run Code Online (Sandbox Code Playgroud)

错误:指定的初始值设定项不能与非聚合类型“Point”一起使用

我是否遗漏了一些明显的东西(为什么如果指定的初始化器与具有公共成员但不是聚合的结构/类一起工作会很糟糕)或者这只是一个没有添加到标准中的缺失功能?

c++ designated-initializer c++20

4
推荐指数
2
解决办法
309
查看次数

如何在 C++ 中使用派生聚合的指定初始化?

我有一个B从另一个聚合派生的聚合结构A。我想初始化它,有两个选项:普通聚合初始化和C++20指定初始化器:

struct A {};
struct B : A { int x; };

int main() {
    [[maybe_unused]] B x{{},1}; //ok everywhere
    [[maybe_unused]] B y{.x=1}; //warning in GCC
}
Run Code Online (Sandbox Code Playgroud)

普通的初始化{{},1}工作正常,但在这种情况下看起来太笨拙,因为{}父聚合需要额外的费用。

指定的初始化器{.x=1}在这里对我来说看起来更好,但它们在 GCC 中产生一个奇怪的警告:

warning: missing initializer for member 'B::<anonymous>' [-Wmissing-field-initializers]
    6 |     [[maybe_unused]] B y{.x=1}; //warning in GCC
      |                              ^
Run Code Online (Sandbox Code Playgroud)

演示: https: //gcc.godbolt.org/z/8jEYY16c6

有没有办法在这里使用指定的初始化器并同时让GCC平静下来消除警告?

c++ designated-initializer c++20

4
推荐指数
1
解决办法
743
查看次数