【问题标题】:iOS how to introduce an ability for a class to have UDID without subclassing everything?iOS 如何在不继承所有内容的情况下为类引入 UDID 的能力?
【发布时间】:2014-01-05 18:46:30
【问题描述】:

我正在使用密钥归档,发现我的一些对象需要具有通用标识符。我正在考虑为此目的引入 UDID。

我可以像这样创建一个自定义类并让我的对象从它继承,但这意味着 udid 的多个实现。我只想要一个。

@interface NSObjectWithUDID : NSObject

@property(nonatomic,strong,readonly)NSString* udid;

@end

我的问题是:如何为我的类添加响应 [udid] 消息的功能,而不必继承 NSObjectWithUDID?

我尝试了类别,但不确定是否可以使用那里的属性。

【问题讨论】:

  • 我认为您的意思是 GUID,而不是 UDID。
  • 或 UUID(GUID 实际上是 Microsoft 的 UUID 实现)

标签: ios objective-c inheritance nsobject udid


【解决方案1】:

您是对的,您不能在 Category 中添加属性,但您可以使用 objc 运行时方法进行运行时设置

#import <objc/runtime.h>
static char udidKey;

@implementation NSObject (UDIDAddition)

- (NSString *)udid {
   return objc_getAssociatedObject(self, &udidKey);
}

- (void)setUdid:(NSString *)udid {
    objc_setAssociatedObject(self, &udidKey, udid, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

【讨论】:

  • 您可以将属性添加到类别中,但它们不能有支持变量。如果 UDID 是通过某种方式计算出来的,那么在类别接口中添加一个属性就可以了。您只需自己实现 getter(如果不是只读,则为 setter),就像在您的示例中一样。
  • 是的,但对于大多数 udid 生成方法而言,存储/检索可能会快得多
  • 这是一个非常好的解决问题的方法。我有一个通用的 NSObject 类别,它具有 setAsscValueForkey 和 asscValueForKey 方法,可让您使用关联存储随意将键/值对添加到对象。它就像一个魅力。对于像这样需要添加特定属性的情况,创建由关联存储支持的属性 getter/setter 是理想的选择。
  • UDID 被延迟实例化,据我所知,这需要一个支持变量。
【解决方案2】:

为什么你认为这意味着udid 的多个实现?

如果您有类ABC 等继承自NSObject,并且您将它们全部切换为从NSObjectWithUDID 继承,那么只有udid 的一种实现 -它是由编译器为你实现的。

您是对的,使用类别添加属性并非易事 - 但可以使用关联对象来完成。不过,这里似乎没有必要走那条路。

HTH

【讨论】:

  • 除非您希望拥有 UUID 的某些类是系统定义的类,否则该方法有效。
  • 我将子类化的一些类来自 SpriteKit 框架,我只能从它们继承,比如 SKSpriteNode。您的解决方案就是我现在所拥有的,我只是在想可能会有更好的解决方案。
  • @AlexStone - 如果是这种情况,请使用关联对象 - 它们提供您需要的“支持变量”,只需在 getter 中进行正常的惰性实例化即可。
猜你喜欢
  • 2015-11-25
  • 2010-12-24
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
相关资源
最近更新 更多