【问题标题】:Subclassing NSString in Objective-C在 Objective-C 中子类化 NSString
【发布时间】:2011-10-17 04:59:57
【问题描述】:

如果我有类似的课程

@interface myclass:NSString
   {
       double b;
   }

现在如果我想同时更改 myclass 的值 b 和字符串值,我应该在 alloc init 之后如何进行?

【问题讨论】:

  • 你可能想要构建一个新的类一个双精度和一个NSString,而不是一个一个NSString的类。
  • 我在下面的回答中给出了 Eiko 建议的示例。
  • 你和stackoverflow.com/users/872302/user872302是同一个用户吗?如果不是,您能否简要解释一下为什么您拥有相同的 IP 地址并发布类似的问题?

标签: ios objective-c nsstring


【解决方案1】:

您可以在此处查看我的 NSString 子类化示例:https://stackoverflow.com/a/21331422/1891772

PS。仅在需要子类化 NSString 并且您不能使用包装器时才使用它

【讨论】:

    【解决方案2】:

    您需要像这样将新的 double 公开为属性:

    @interface MyClass : NSString
    {
        double b;
    }
    
    @property double b;
    
    @end
    

    然后在.m文件中:

    @implementation MyClass
    
    @synthesize b;
    
    @end
    

    那么当你创建一个实例时,你可以访问double属性:

    MyClass* myClassInstance = [[MyClass alloc] init];
    myClassInstance.b = 1.2;
    

    编辑以上行不通!看看雅各布的回答为什么......

    作为安慰奖,这里有一个包装类,它会给你一个 String 和 Double

    @interface MyString : NSObject
    
    @property (nonatomic, retain) NSString* string;
    @property double b;
    
    - (id)initWithString:(NSString *)aString andDouble:(double)aDouble;
    
    @end
    

    和实施

    @implementation MyString
    
    @synthesize string, b;
    
    - (id)initWithString:(NSString *)aString andDouble:(double)aDouble
    {
        self = [super init];
        if (self) {
            self.string = aString;
            self.b = aDouble;
        }
    
        return self;
    }
    
    - (void)dealloc
    {
        [string release];
        [super dealloc];
    }
    
    @end
    

    【讨论】:

    • 这样我就赋予了b价值
    • 但是如何为我的班级字符串赋予价值。我不能在这个类上调用 initWithString,因为 NSString 是类集群的抽象父类
    • 我的立场是正确的......你不能将存储添加到现有的类!您必须编写一个包装类。
    • 我添加了一个包装器,它会在一个类中为您提供 NSString + Double。
    【解决方案3】:

    注意,继承 NSString 不是一个好主意。

    NSString 实际上并不是这么简单的类。并且不应该在没有充分理由的情况下对其进行子类化。

    对于 NSString,最好通过Categories 或对象组合来添加方法。

    但请注意,不允许在类别中添加 ivar。 不过,您可以添加属性,并在 Objective-C 2.0 中使用 associative references 来访问这些私有数据。

    NSString class reference 中有一个关于子类化 NSStrings 的很好的说明:

    可以继承 NSString(和 NSMutableString),但是这样做 所以需要为字符串提供存储设施(这不是 由子类继承)并实现两个原始方法。这 抽象的 NSString 和 NSMutableString 类是公共接口 主要由私有的、具体的类组成的类簇 创建并返回适合给定情况的字符串对象。 使您自己的该集群的具体子类强加某些 要求(在“覆盖的方法”中讨论)。

    确保您对 NSString 进行子类化的原因是有效的。实例 你的子类应该代表一个字符串而不是别的东西。 因此,子类应该具有的唯一属性是 它管理和访问单个字符的字符缓冲区 在缓冲区中。创建 NSString 子类的正当理由包括 提供不同的后备存储(也许是为了更好的性能) 或以不同的方式实现对象行为的某些方面,例如 内存管理。如果您的目的是添加非必要属性 或元数据到您的 NSString 的子类,更好的选择是 是对象组合(参见“子类化的替代方案”)。可可 已经使用 NSAttributedString 类提供了一个示例。

    在类参考的底部还有另一部分是关于 NSString 子类化的替代方案。

    【讨论】:

    • 请注意,在最近的运行时和编译器中,可以添加属性(及其内存)。我仍然不会这样做,因为它会使 NSString 的 每个 实例膨胀。不过,子类化 NSString 在这里可能不是最有意义的。 :)
    【解决方案4】:

    Jacob Gorban 的回答是正确的:您可能不需要对字符串进行子类化。在存储额外数据方面,您可以考虑使用objc_setAssociatedObject

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多