0

我想向 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)。有想法吗?

4

4 回答 4

7

不要尝试子类化NSString来做到这一点。创建一个全新的类,它是它的子类,NSObject并为其提供 2 个属性(以及一组访问属性的方法,如果您愿意)。

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


对于这一行:

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

您需要做的就是description在您的自定义类上实现该方法以返回字符串属性。然后在您使用时会打印该字符串NSLog

于 2013-10-19T18:52:01.890 回答
5

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

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

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

... ETC ...

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


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

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

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

于 2013-10-19T18:53:30.423 回答
0

你为什么不使用 NSMutablestring 在这个你可以使用 appendString 方法,你可以添加你的任何 stringValue 然后只是将相同的传递给你的字符串。

于 2013-10-19T19:21:47.377 回答
0

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

标题:

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

#import <Foundation/Foundation.h>
// https://stackoverflow.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
于 2014-10-10T06:09:52.197 回答