,如果我有一個像子類的NSString的目標C
@interface myclass:NSString
{
double b;
}
現在
一類,如果我想改變b值和MyClass的字符串值都,應該怎樣的alloc初始化後,繼續
,如果我有一個像子類的NSString的目標C
@interface myclass:NSString
{
double b;
}
現在
一類,如果我想改變b值和MyClass的字符串值都,應該怎樣的alloc初始化後,繼續
你需要公開的新的雙像這樣的屬性:
:@interface MyClass : NSString
{
double b;
}
@property double b;
@end
在.m文件
然後
那麼當你創建一個實例,您可以訪問的雙重屬性:
MyClass* myClassInstance = [[MyClass alloc] init];
myClassInstance.b = 1.2;
編輯:以上都不行!見雅各布的回答,爲什麼...
作爲安慰獎,這裏有一個包裝類,會給你一個字符串&雙
@interface MyString : NSObject
@property (nonatomic, retain) NSString* string;
@property double b;
- (id)initWithString:(NSString *)aString andDouble:(double)aDouble;
@end
和實施
@implementation MyString
@synthesize string, b;
- (id)initWithString:(NSString *)aString andDouble:(double)aDouble
{
self = [super init];
if (self) {
self.string = aString;
self.b = aDouble;
}
return self;
}
- (void)dealloc
{
[string release];
[super dealloc];
}
@end
注意,這是對NSString進行子類化並不是一個好主意。
NSString其實不是這麼簡單的類。如果沒有充分的理由,它不應該被分類。
對於NSString,通過Categories或對象組合添加方法要好得多。
但請注意,不允許在類別中添加ivar。 但是,您可以添加屬性,並在Objective-C 2.0中使用associative references來訪問此私有數據。
有正確的NSString class reference關於繼承NSString的一個很好的說明:
是可能的子類的NSString(和的NSMutableString),但這樣做 所以需要字符串提供儲存設施(不 通過繼承子類)並實現兩個原始方法。抽象的NSString和NSMutableString類是類集羣的公共接口 ,主要由私有的具體類組成,這些類創建並返回適合給定情況的字符串對象。 製作您自己的該集羣的具體子類會強制某些要求(請參閱「替代方法」中的討論)。
確保您的NSString子類的原因是有效的。你的子類的實例 應該代表一個字符串,而不是別的。 因此,子類應該具有的唯一屬性是它所管理的字符緩衝區的長度爲 ,並訪問緩衝區中的單個字符 。製作NSString子類的有效理由包括提供不同的後備存儲(可能爲了更好的性能) 或實現對象行爲的某些方面不同,如 內存管理。如果您的目的是將非基本屬性 或元數據添加到您的NSString的子類中,則更好的替代方法是 是對象組合(請參閱「子類化的替代方法」)。可可 已經提供了NSAttributedString類的一個例子。
並且在類的引用的底部還有另一部分關於NSString子類的替代方法。
請注意,在最近的運行時和編譯器中,它*可以添加屬性(以及它們的內存)。不過我不會這樣做,因爲它會膨脹NSString的每一個實例。儘管如此,子類化NSString可能不是最有意義的。 :) – Eiko
Jacob Gorban的回答是正確的:你可能不需要子類化字符串。在存儲額外數據方面,您可能會考慮使用objc_setAssociatedObject
。
你可以看到我的NSString的子類在這裏例如:https://stackoverflow.com/a/21331422/1891772
PS。只有在需要子類化NSString並且不能使用包裝的情況下才可以使用它。
您可能想要構建一個新的類,該類有* double和NSString,而不是* * NSString。 – Eiko
我在下面的答案中給出了Eiko建議的例子。 –
你是一樣的用戶http://stackoverflow.com/users/872302/user872302?如果沒有,你能否簡要解釋爲什麼你有相同的IP地址併發布類似的問題? –