子类 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的主要内容,如果未能解决你的问题,请参考以下文章