子类 NSString

Posted

技术标签:

【中文标题】子类 NSString【英文标题】:Subclass NSString 【发布时间】:2013-10-19 18:46:17 【问题描述】:

我想给一个 NSString 对象添加一个属性。出于这个原因,我想继承它。

我尝试做这样的事情:

@interface MyString : NSString
@property (nonatomic) NSInteger userId;
@end

那我就可以了

MyString *testString = [[MyString alloc] init];
testString = [MyString stringWithFormat:@"hello"];
testString.userId = 2;

NSLog(@"testString: %@", testString); //-> Want it to return "testString: hello"
NSLog(@"userId: %d", testString.userId); //-> Want it to return "userId: 2"

我不知道如何继承 NSString(创建存储设施,重写一些方法(长度,characterAtIndex)。有想法吗?

【问题讨论】:

为什么字符串会有用户ID? 【参考方案1】:

不要尝试继承 NSString 来执行此操作。创建一个全新的类,它是NSObject 的子类,并为其提供 2 个属性(以及一组访问属性的方法,如果您愿意的话)。

尝试使用NSString 过于复杂且不合适。


对于这一行:

NSLog(@"testString: %@", testString);

您需要做的就是在您的自定义类上实现description 方法以返回字符串属性。那么当你使用NSLog时,字符串就会被打印出来。

【讨论】:

谢谢。我需要它来使用一个库,该库提供用于选择联系人的令牌字段(例如在苹果的 SMS 应用程序中)。我为其提供了一个名称数组,但我想保留此人的 id(作为人名的属性)。我不想覆盖描述方法,因为目标不是在控制台中打印。 关联对象也是一种选择,但对于这个简单的用例来说可能过于复杂。 你为什么不给我们一个将名字映射到身份的字典? 我目前使用类似的技巧。但我有一些人同名。 因此,如果您可以有多个相同的字符串,那么您真的应该修改您正在使用的库(因为您需要唯一标识令牌并且应该通过 id 来完成)。修改库不太难。【参考方案2】:

正如您所发现的,子类化集群类很棘手。这就是为什么,一般来说,它几乎从来没有完成过。

相反,创建一个封装两个字符串的类;在您的示例中指向 @"hello" 的字符串和 userId。

@interface MyThingy:NSObject
@property(copy) NSString *stringData;
@property(copy) NSString *userId;
@end

...等等...

这将更加灵活,并且将来更容易重构。


顺便说一句,这没有意义:

MyString *testString = [[MyString alloc] init];
testString = [MyString stringWithFormat:@"hello"];

在手动保留/释放下,这是一个泄漏。在 ARC 下,这是一种无目的的分配。

【讨论】:

好的,谢谢,但是当我的对象被调用时,有没有办法返回 NSString stringData?无需精确的 nameOfTheObject.stringData ? 您必须定义when my object is called 的含义。但是,一般来说,不,这是设计使然。字符串旨在成为单个、有凝聚力的数据块,除了封装字符串之外没有附加功能。它是一个类似于 NSDate 或 NSNumber 的原语。虽然这里和那里可能需要多几行代码,但这样处理它会导致应用程序设计更加健壮和一致。 感谢您的解释【参考方案3】:

你为什么不使用 NSMutablestring,你可以使用 appendString 方法,你可以在其中添加任何 stringValue,然后将其传递给你的字符串。

【讨论】:

也不需要创建子类 我终于做到了!【参考方案4】:

试试这个类别。您可以通过使用键将任何类型的自定义对象添加到来自 NSObject 的任何内容 - 基本上是任何类。使用该键检索对象。我想我是从 someone(在 *** 上找到的)这里得到的。

标题:

//
//  NSObject+arbitraryobjectonanynsobjectlol.h
// 
//
//  Created by someone on 2/21/14.
//  Copyright (c) 2014 someone. All rights reserved.
//

#import <Foundation/Foundation.h>
// https://***.com/a/10319083/129202
@interface NSObject (arbitraryobjectonanynsobjectlol)
- (id)associativeObjectForKey: (NSString *)key;
- (void)setAssociativeObject: (id)object forKey: (NSString *)key;
@end

以及实现:

//
//  NSObject+arbitraryobjectonanynsobjectlol.m
//  someone
//
//  Created by someone on 2/21/14.
//  Copyright (c) 2014 someone. All rights reserved.
//

#import "NSObject+arbitraryobjectonanynsobjectlol.h"

#import <objc/runtime.h>

@implementation NSObject (arbitraryobjectonanynsobjectlol)
static char associativeObjectsKey;

- (id)associativeObjectForKey: (NSString *)key 
    NSMutableDictionary *dict = objc_getAssociatedObject(self, &associativeObjectsKey);
    return [dict objectForKey: key];


- (void)setAssociativeObject: (id)object forKey: (NSString *)key 
    NSMutableDictionary *dict = objc_getAssociatedObject(self, &associativeObjectsKey);
    if (!dict) 
        dict = [[NSMutableDictionary alloc] init];
        objc_setAssociatedObject(self, &associativeObjectsKey, dict, OBJC_ASSOCIATION_RETAIN);
     [dict setObject: object forKey: key];

@end

【讨论】:

以上是关于子类 NSString的主要内容,如果未能解决你的问题,请参考以下文章

ios中怎么把一个data类型转换成字符串

java 子类与父类

子类化一个 NSManagedObject 子类

java 子类强转父类 父类强转子类

子类调用父类static方法怎么获得子类类名

子类可以直接调用父类的函数吗