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

あなたが発見したように、クラスクラスタークラスのサブクラス化はトリッキーです。これが、一般的に、ほとんど行われない理由です。

代わりに、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 の下では、これは無意味な割り当てです。

于 2013-10-19T18:53:30.423 に答える
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 に答える
0

これでNSMutablestringを使用しないのはなぜですか。appendStringメソッドを使用して、任意のstringValueを追加してから、同じものを文字列に渡すことができます。

于 2013-10-19T19:21:47.377 に答える