2011-08-01 47 views
0

,如果我有一個像子類的NSString的目標C

@interface myclass:NSString 
    { 
     double b; 
    } 
現在

一類,如果我想改變b值和MyClass的字符串值都,應該怎樣的alloc初始化後,繼續

+1

您可能想要構建一個新的類,該類有* double和NSString,而不是* * NSString。 – Eiko

+0

我在下面的答案中給出了Eiko建議的例子。 –

+0

你是一樣的用戶http://stackoverflow.com/users/872302/user872302?如果沒有,你能否簡要解釋爲什麼你有相同的IP地址併發布類似的問題? –

回答

1

你需要公開的新的雙像這樣的屬性:

@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 
+0

通過這種方式,我給了b – neel8986

+1

的價值,但是如何賦予我班級的價值。我無法通過此類調用initWithString,因爲NSString是類集羣的抽象父類 – neel8986

+0

我站得更正了......您無法將存儲添加到現有類中!你將不得不編寫一個包裝類。 –

7

注意,這是對NSString進行子類化並不是一個好主意。

NSString其實不是這麼簡單的類。如果沒有充分的理由,它不應該被分類。

對於NSString,通過Categories或對象組合添加方法要好得多。

但請注意,不允許在類別中添加ivar。 但是,您可以添加屬性,並在Objective-C 2.0中使用associative references來訪問此私有數據。

有正確的NSString class reference關於繼承NSString的一個很好的說明:

是可能的子類的NSString(和的NSMutableString),但這樣做 所以需要字符串提供儲存設施(不 通過繼承子類)並實現兩個原始方法。抽象的NSString和NSMutableString類是類集羣的公共接口 ,主要由私有的具體類組成,這些類創建並返回適合給定情況的字符串對象。 製作您自己的該集羣的具體子類會強制某些要求(請參閱「替代方法」中的討論)。

確保您的NSString子類的原因是有效的。你的子類的實例 應該代表一個字符串,而不是別的。 因此,子類應該具有的唯一屬性是它所管理的字符緩衝區的長度爲 ,並訪問緩衝區中的單個字符 。製作NSString子類的有效理由包括提供不同的後備存儲(可能爲了更好的性能) 或實現對象行爲的某些方面不同,如 內存管理。如果您的目的是將非基本屬性 或元數據添加到您的NSString的子類中,則更好的替代方法是 是對象組合(請參閱「子類化的替代方法」)。可可 已經提供了NSAttributedString類的一個例子。

並且在類的引用的底部還有另一部分關於NSString子類的替代方法。

+0

請注意,在最近的運行時和編譯器中,它*可以添加屬性(以及它們的內存)。不過我不會這樣做,因爲它會膨脹NSString的每一個實例。儘管如此,子類化NSString可能不是最有意義的。 :) – Eiko

1

Jacob Gorban的回答是正確的:你可能不需要子類化字符串。在存儲額外數據方面,您可能會考慮使用objc_setAssociatedObject