为什么 gcc 会警告“self = [super initDesignatedInit];”不兼容的结构赋值在派生类中调用?

2024-01-07

我在 Objective-C 中有以下基/派生类设置:

@interface ASCIICodeBase : NSObject {
 @protected
  char code_[4];
}
- (Base *)initWithASCIICode:(const char *)code;
@end

@implementation ASCIICodeBase
- (ASCIICodeBase *)initWithCode:(const char *)code len:(size_t)len {
  if (len == 0 || len > 3) {
    return nil;
  }
  if (self = [super init]) {
    memset(code_, 0, 4);
    strncpy(code_, code, 3);
  }
  return self;
}
@end

@interface CountryCode : ASCIICodeBase
- (CountryCode *)initWithCode:(const char *)code;
@end
@implementation CountryCode
- (CountryCode *)initWithCode:(const char *)code {
  size_t len = strlen(code);
  if (len != 2) {
    return nil;
  }
  self = [super initWithCode:code len:len]; // here
  return self;
}
@end

在标记为“此处”的行上,我收到以下 gcc 警告:

warning: incompatible Objective-C types assigning 'struct ASCIICodeBase *', expected 'struct CurrencyCode *'

这段代码有问题还是我应该有ASCIICodeBase return id?或者也许在“这里”行上使用强制转换?


Use (id)作为返回值类型。

Objective-C 不支持协变声明。考虑:

@interface NSArray:NSObject
+ (id) array;
@end

现在,您可以致电+array双方NSArray and NSMutableArray。前者返回一个不可变数组,后者返回一个可变数组。由于 Objective-C 缺乏协变声明支持,如果上面声明为返回(NSArray*),子类方法的客户端必须转换为`(NSMutableArray*)。丑陋、脆弱且容易出错。因此,使用泛型类型通常是最直接的解决方案。

所以...如果您声明一个返回特定类实例的方法,请显式进行类型转换。如果您声明一个将被重写的方法,并且该重写可能会返回一个子类and它返回子类的事实将暴露给客户端,然后使用(id).

指定初始化器的工作方式相同。一个-init*方法可以返回几乎任何类型的实例,具体取决于实现的上下文(当然)。因此,初始化方法的返回类型是协变的,因此,您需要使用(id)作为返回类型。

无需提交错误——已经有几个错误了。


请注意,LLVM 现在有一个instancetype可以用来代替的关键字id在像上面这样的声明中。它的意思是“这个方法返回一个传递一个实例isKindOfClass:有效地测试其被调用的类”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 gcc 会警告“self = [super initDesignatedInit];”不兼容的结构赋值在派生类中调用? 的相关文章

  • 使用 Python 查找 Mac OS X 中的当前活动窗口

    有没有办法使用 Python 在 Mac OS X 上查找给定时间当前活动窗口的应用程序名称 这应该有效 usr bin python from AppKit import NSWorkspace activeAppName NSWorks
  • 使用 AFNetworking 的 setImageWithURL 时如何配置缓存

    我在用着setImageWithURL在我的应用程序中下载一些图像 是否可以 指定此图像必须在缓存中保存多长时间 例如 1 周 指定缓存的最大总大小有多大 例如 200 兆 查看图像缓存中有什么 清除缓存 文档 http engineeri
  • Gnu C++ 何时会在没有明确要求的情况下支持 C++11?

    目前 使用 g 4 8 1 您必须通过以下方式在 C 11 模式下编译文件 g std c 11 o prog x prog cpp 当我只能说的时候有计划吗 g o prog x prog cpp 编译prog cpp Maybe pro
  • 使用 NSSet/NSMutableSet 来过滤对象?

    我已经看到一些有关使用 NSSet NSMutableSet 过滤对象的问题 答案 这些情况使用简单类型的对象 例如NSString or int 以下是用于过滤的代码示例NSString对象 NSSet smallArray NSSet
  • 我可以在 NS_SWIFT_NAME 中使用保留关键字吗?

    我正在尝试使 Objective C 委托协议更漂亮以便在 Swift 中使用 但我在弄清楚如何使用时遇到了一些麻烦NS SWIFT NAME 是否可以使用NS SWIFT NAME指定 Swift 名称中与 Objective C 关键字
  • iOS:弃用 AudioSessionInitialize 和 AudioSessionSetProperty

    我对 Objective C 很陌生 正在尝试更新一些大约 3 年前的代码以与 iOS 7 一起使用 有两两个实例AudioSessionSetProperty and AudioSessionInitialize出现在代码中 1 void
  • 使用 Objective-C 在 iPhone 应用程序中显示或隐藏 UIButton

    我在用UITextView编辑文本 我想用两个UIButtons编辑并保存 最初我想显示编辑UIButton 当用户单击编辑时我想显示保存UIButton 当内容成功保存后 我不想再显示保存按钮 我是一名 C 编码员 在 C 中我曾经这样做
  • iOS:从非图像数据生成图像(Godus,如风景)

    所以看到图像后Godus http www kickstarter com projects 22cans project godus我想知道如何生成简单的 非交互式的 2D 图像 with 不同高度或层数的颜色不同就像下面的图片一样 我只
  • 自动布局和ios5

    我正在使用故事板 我已经使用了自动布局 但它不适用于 ios5 并且会崩溃 所以我想删除它 但是 如何取消选中自动布局 但如果我取消选中自动布局 我如何为 iPhone 4 和 5 设置屏幕 Regards 您可以在 IB 中禁用自动布局
  • Objective-c中的贝塞尔曲线算法

    比我聪明的人可以看一下这个吗 我正在尝试实现我发现的贝塞尔曲线算法here http webtweakers com swag GRAPHICS 0074 PAS html在 Objective c 中 输出是错误的 我想我正确地转换了代码
  • 如何在ios中以编程方式添加水平间距和垂直间距?

    我在 ios 8 中创建了一个应用程序 因为我有 4 个可垂直使用的标签 它应该在某些条件下更改位置 所以我已禁用自动布局并以编程方式设置约束 现在的问题是 我可以设置水平和垂直位置 宽度和高度的约束 但我找不到任何方法来添加标签之间的水平
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 应用程序发布后,对如何更新 UITableView 上的数据源感到困惑

    阅读文档后 我似乎误解了有关数据管理的一些概念 所以我试图澄清一些方面 如果这篇文章听起来多余和重复 请道歉 我的应用程序有多个 TableView 每个表视图都有一个 pList 形式的数据源 因此 我有几个属性列表用作我的表的数据源 目
  • 具有非零“内容”的 QTMovieLayer 的 iOS 替代品?

    背景 QTKit QuickTime Kit 是一个来自 10 3 天的 Mac 框架 在 10 5 中添加了一些层 例如QTMovieLayer QTMovieLayer 的好处之一是您可以使用常规访问电影内容content图层上的属性并
  • 推送/呈现模态视图控制器

    我的视图控制器中有一个表 我们称之为 TVC1 我使用了 TVC1 中的行 以便用户除了 TVC1 上的数据之外还可以输入更多数据 因此 当有人点击 TVC1 中的特定行时 它将显示另一个视图控制器 我们称之为 TVC2 然而 当显示TVC
  • 我无法捕获 WKWebView 的屏幕截图

    我正在尝试捕获 WKWebView 的屏幕截图 但我的方法无法正常工作 它返回纯色 就好像图层树为空一样 而它似乎适用于其他视图 UIImage screenshot UIImage screenshot UIGraphicsBeginIm
  • CocoaPods 生成无效的项目文件(未找到标头)

    我有一个带有 Podfile 的项目文件 如下所示 platform ios 7 0 def import pods pod Specta 0 1 8 pod Expecta 0 2 1 pod RestKit 0 20 3 pod Mag
  • iPhone ImageView序列动画

    嘿 尝试将一个简单的 png 序列动画放入我的应用程序中 我在 IB 中放置了第一个框架 并将图形动画出口连接到它 序列中有 54 个 png 名称为 Comp 1 0000 png 到 Comp 1 00053 png 这是我的代码 vo
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 后台模式下的 AVSpeechSynthesizer

    我无法获取 iOS 7AVSpeechSynthesizer当我的 iOS 应用程序处于后台模式时工作 我添加了 应用程序播放音频 应用程序支持的后台模式的关键 但我仍然无法让它工作 我还研究了创建一个AVMutableCompositio

随机推荐

  • AWS - 从公共 API 网关到 VPC 内 lambda 的路由

    Question 从面向公众的AWS网络中的API网关到VPC子网中的Lambda函数 流量经过哪里 推出 Amazon API Gateway 私有终端节点 https aws amazon com blogs compute intro
  • 您的分支比“origin/master”领先 1 次提交

    我对 Git 有点陌生 我希望有人能在我的场景中解释这条消息的确切含义 为了向您提供一些背景信息 这就是我所做的 我已将存储库克隆到本地计算机 创建了一个新分支并进行了一些更改 然后 我将这些更改添加到暂存 跟踪区域 提交更改 然后将所有内
  • 升级到 Xcode 12 后出现问题:ld:为 iOS 模拟器构建,但链接到为 iOS 构建的 dylib,架构 arm64

    我将 Xcode 升级到 Xcode 12 并构建了我的项目 首先 它会出现如下错误 ld 为 iOS 模拟器构建 但链接到为 iOS 构建的 dylib 文件 Users ethanli Documents Aspira RA com4i
  • 为什么 NHibernate 不支持 MySql 上的批处理

    我找到了一个几个地方 http ayende com blog 3830 nh prof new features disabling ignoring alerts人们说它不受支持 但我找不到根本原因是什么 mysql ado net 提
  • Power BI 嵌入 URL - 多个过滤器

    我一直在尝试使用过滤器查询语法来过滤嵌入的 PBI 报告 filter tableName fieldName eq fieldValue 这对我有用 但是 当我应用多个过滤器时 PBI 报告仅根据最后一个 filter 进行过滤 而其他过
  • 表“MyDjango.django_admin_log”不存在

    我无法在 django 应用程序中创建用户和博客 按下保存按钮时 它只是显示错误 表 MyDjango django admin log 不存在 错误消息如下所示 您最近是否启用了管理历史记录 但忘记运行syncdb 据我所知 Django
  • uilabel 尾部截断

    我正在使用 Objective C 开发一个 ios 应用程序 并且我遇到了 uilabel 的问题 我需要一些帮助 基本上我有一个标签 可以更改大小以适应它将显示的文本 但它有一个可能的最大高度 标签本身始终具有固定宽度 我已打开 UIL
  • 如何将视频从 URI 转换为 byte[]

    我已经捕获了视频并获得了该视频的 URI 如何加载该URI指向的内容到byte 结构 看一下 ByteArrayOutputStream http download oracle com javase 6 docs api java io
  • 3.1.4 textAlignment丢失(Android Studio)

    我有新版本的 Android Studio 3 1 4 但我找不到 textAlignment 我已经在 查看所有属性 中进行了搜索 现在就找人在我能找到的地方吧 谢谢回答 以下是我解决该问题的方法 在 Android Studio 3 3
  • JQuery 自动完成自定义显示多列第 2 部分

    我正在尝试获得类似于以下内容的自动完成功能 Here http jqueryui com demos autocomplete custom data在 jquery ui 的自定义示例中 相反 这将使用 ajax 调用而不是硬编码数据 我
  • 如何在核心数据中保存现有的单例表视图数据?

    我的项目中有这样的单例购物车var fromSharedFood SingletonCart sharedFood food 我正在从 MainVC 到 DetailVC gt MyCartVC 获取所有食物数据 我在 MainVC 中有表
  • 将 React 的不可变助手与 Immutable.js 结合使用

    我正在研究助焊剂应用并正在考虑采用不可变 js https github com facebook immutable js来维持状态 我看到 React 提供了自己的帮助器来更新不可变对象 http facebook github io
  • 如何在 Android Studio 中查找 Kotlin 的最新版本

    我打开了一个前段时间创建的 Android Studio 项目 IDE 说 Kotlin 的 gradle 插件支持 Kotlin 版本 1 2 51 或更高版本 我想将其设置为最新版本 但我必须去 Kotlin 网站 在该网站上不容易找到
  • C++ 声明顺序(在多变量声明行中)

    我在我的 C 代码中使用以下内容 int a 0 b a 我想知道这种行为是否可靠且定义良好 名称声明从左到右的顺序 并且我的代码不会与其他带有未申报的名字 error 如果不可靠 我会打破这个说法 int a 0 int b a 谢谢 我
  • 显示电子邮件地址和联系电话的安全方式

    是否有任何提示可以在联系表单网页上显示联系电话号码和电子邮件 我的页面上有一个联系表格 但也希望人们可以选择直接打电话或发送电子邮件 目前它们以纯文本显示 但感觉这是不安全的 并且对爬行网站以获取此类信息的机器人开放 有安全的方法吗 Tha
  • PHP - 设置带有签名验证的 Webhook 接收器

    我需要设置一个 PHP 页面来接收 Webhook 我过去已经做过很多这样的事情 所以这不是问题 但是我正在为这个项目使用的 API 要求我的 webhook 验证标头中提供的签名 作为验证请求的一部分 它将发送以下内容 HEADER x
  • 如何转储 SoapClient 请求或响应以进行调试?

    我需要调试一些使用的代码SoapClient班级 我发现方法记录如下 getLastRequest 但它只返回null client new SoapClient https example com service wsdl respons
  • Android 依赖项引用不存在的库 google-play-services_lib.jar

    我一直在尝试让一个简单的地图出现在应用程序中 如 Google 地图 v2 文档所示 这让我经历了一段糟糕的时光 Eclipse 不断地说 容器 Android 依赖项 引用不存在的库 X Android Development works
  • UIView alpha 与 UIColor alpha

    我想知道以下之间的区别 为我的 UIView 分配 alpha 值 为其指定不透明颜色 但为 UIView 指定 在屏幕截图上 我制作了两个 UIView 每个视图顶部都有两个黑色 alpha 1 0 UILabels 假设之前定义了一个宏
  • 为什么 gcc 会警告“self = [super initDesignatedInit];”不兼容的结构赋值在派生类中调用?

    我在 Objective C 中有以下基 派生类设置 interface ASCIICodeBase NSObject protected char code 4 Base initWithASCIICode const char code