子类NSString

我想添加一个属性到一个NSString对象。 出于这个原因,我想要inheritance它。

我试图做这样的事情:

@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(创build存储设施,重写一些方法(长度,characterAtIndex)。有一个想法?

不要尝试子类化NSString来做到这一点。 创build一个全新的类,它是NSObject一个子类,并给它2个属性(和一组方法来访问属性,如果你想)。

试图使用NSString是过于复杂和不适当的。


对于这一行:

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

所有你需要做的就是在你的自定义类上实现description方法来返回string属性。 然后,当你使用NSLog时,string将被打印。

正如你所发现的那样,对类集群类进行子类化是非常棘手的。 这就是为什么,一般来说,它几乎从来没有做过。

相反,创build一个封装两个string的类; 在你的例子和userId中指向@“hello”的string。

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

…等…

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


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

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

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

为什么不使用NSMutableString在这个你可以使用appendString方法,你可以添加你的任何stringValue,然后只是传递给你的string。

试试这个类别。 你可以添加任何types的自定义对象来自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