在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
我正在使用 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) 我是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) 从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,我收到一条错误,指出我需要调用我指定的初始化程序之一.
我正在使用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
鉴于以下内容:
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)
在同一个主要问题中,示例三如何工作?我主要对使用标准初始化器的指定初始化器的任意排序感到困惑.
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像这样的?
我只花了大约凌晨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 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”一起使用
我是否遗漏了一些明显的东西(为什么如果指定的初始化器与具有公共成员但不是聚合的结构/类一起工作会很糟糕)或者这只是一个没有添加到标准中的缺失功能?
我有一个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平静下来消除警告?