- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果我执行以下操作,编译器不会报错:
id foo;
[foo retain];
但是,如果我执行以下操作,编译器会报错:
id<NSCopying> bar;
[bar retain];
具体来说,它说:
Instance method '-retain' not found (return type defaults to 'id')
这是为什么?我想一个 id
指向一个通用的 Objective-C 对象,我可以传递 retain
到任何 Objective-C 对象。
请注意,这是一个警告,而不是一个错误,所以我仍然可以编译代码并且它似乎可以工作。我还注意到我可以执行以下操作来抑制警告:
[(id)bar retain];
但我认为id<NSCopying>
是 id
的子类型,所以任何可以在 id
上完成的事情可以在 id <NSCopying>
上完成...
最佳答案
你不一定要发送retain
到任何 Objective-C 对象。 retain
是 NSObject 协议(protocol)的一部分。碰巧所有的 Cocoa 都符合 NSObject,但从语言的角度来看它仍然不是真正通用的(可以定义一个不符合 NSObject 的类或继承自 NSObject 类;它只是不很有用)。
声明为 id<NSCopying>
表示“只允许我在 NSCopying 协议(protocol)中发送消息”——NSCopying 不包括 retain
.为了从 NSObject 协议(protocol)发送消息,您必须将变量声明为 id
(在这种情况下不会发生类型检查),id<NSObject>
(在这种情况下,您只能在 NSObject 协议(protocol)中发送消息)或作为符合 NSObject 的类的实例。
如果您将某些内容声明为 id<NSCopying>
,您通常要发送对象 copy
而不是 retain
,因为这就是以这种方式声明它的全部意义所在。如果 NSCopying 站在这里是为了你自己的协议(protocol),你可以通过像这样定义它来使协议(protocol)本身符合 NSObject:
@protocol YourProtocol <NSObject>
如果你真的需要声明一个符合两个协议(protocol)的变量(这很不寻常,但偶尔会出现),你可以用逗号分隔的协议(protocol)列表来声明它,比如 id<NSCopying,NSObject>
.
关于ios - 为什么在 id<NSCopying> 上保留会发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18794160/
我有一个单例对象来管理我的所有列表。我们将其称为 ListStore。 ListStore 有一个可变数组,用于存储列表。 @interface ListStore : NSObject @p
在 Swift 2.1 中,我应该如何创建一个符合 NSCopying 协议(protocol)的类? 我试过这个: class TargetValue: NSObject, NSCopying {
我已阅读 NSCopying 文档,但我仍然不确定如何实现所需的内容。 我的类(class)供应商: @interface Vendor : NSObject { NSString
1、几点说明 说到NSCopying和NSMutableCopying协议,不得不说的就是copy和mutableCopy。 如果类想要支持copy操作,则必须实现NSCopying协议,也就是
我正在尝试使用 swift NSCopy 来深度复制 GKGameModel 的对象,包括所有玩家及其钱包引用(包含代表现金的整数)。 使用 Swift Playgrounds,我尝试将 100 美元
我正在学习如何使用 NSCopy。我想复制我正在使用的自定义对象,它是 UIScrollView 中的 ImageView。 我正在尝试按如下方式实现 NSCopying 协议(protocol):
我正在将一些 Obj-C 代码转换为 Swift 并遇到了一个问题。这是 ObjC 代码: - (void)collisionBehavior:(UICollisionBehavior *)behav
我知道如果您的对象将用作 NSDictionary 中的键,则需要它。还有其他像这样的时候需要 NSCopying 吗? 如果我认为我的模型对象不需要符合 NSCopying,我可能错了吗? 最佳答案
我有一个小类层次结构,我在实现 copyWithZone: 时遇到了问题。我已阅读 NSCopying 文档,但找不到正确的答案。 参加两个类(class):Shape 和Square。正方形定义为:
我尝试在 Swift 中使用 NSDictionary ,但遇到了上述问题。我有以下格式的字典: let xyz: NSMutableDictionary = ["1":[1,2,3,4,"1","n
我正在尝试将我的应用程序从 8 升级到 Xcode 9.3.1,但出现以下错误: Expected method to read dictionary element not found on obj
我正在尝试复制一个对象,我已经实现了 NSCopying 协议(protocol),它看起来像这样: #MyActivity.h @interface MyActivity : MyModel {
如果我执行以下操作,编译器不会报错: id foo; [foo retain]; 但是,如果我执行以下操作,编译器会报错: id bar; [bar retain]; 具体来说,它说: Instanc
在某些情况下(例如,当 Hook 到内部进行测试时)能够创建不采用 NSCopying 的类实例的副本会很方便(不要实现 -copyWithZone:).如何实现? (注意:在类别中实现协议(prot
我有一个派生自 NSObject 的类。如何像[object copy]一样启用copy? 这是一个 iPhone 应用程序。 最佳答案 可以找到 Apple 关于 NSCopying 协议(prot
考虑两个类。第一个是 Vehicle,一个符合 NSCopying 的 NSObject 子类: class Vehicle : NSObject, NSCopying { var wheel
给定一个实现 NSCoding 的类,是否有理由不应该使用此模式来实现 copyWithZone: 的实现: -(instancetype)copyWithZone:(NSZone *)zone{
我可能在这里遗漏了一些明显的东西,但我正在我的一个对象上实现 NSCopying。该对象具有不通过 getter 公开的私有(private)实例变量,因为它们不应该在对象外部使用。 在我的 copy
我正在使用 Metal Performance Shader 设置神经网络,在编写权重初始化类时遇到了问题:Type 'MyWeights' does not conform to protocol
我正在尝试将以下代码转换为 Swift - (id)init { self = [super init]; if (self) { // Fetch Current C
我是一名优秀的程序员,十分优秀!