2015-02-11 101 views
2

使用typedef聲明使我們能夠創建一個新的類型的數據與給出的類型,例如typedef NSString *String;typedef語句

我也可以治療的新型像NSString

typedef NSString *String; 
    String myString = @"Programming is"; 
    NSLog(@"%@", [myString stringByAppendingString:@"cool"]); 

我的問題是 - 我不能使用類方法嗎?下面的代碼產生一個錯誤:

String newString = [[String alloc]init]; 

錯誤說:Receiver type 'String' (aka 'NSString') is not an Objective-C class

但隨着typedef發言中,我們得到相同的NSString對象(在我的理解)既類方法和實例方法。實例方法工作正常,類方法不起作用。

這是爲什麼發生?

+0

使用的typedef別名框架類的名稱是一個可怕的想法,順便說一句。 – jlehr 2015-02-11 13:01:01

+0

@jlehr我只是爲了學習語言功能:) – 2015-02-11 14:27:03

+0

優秀,否則我會一直擔心你。 :-) – jlehr 2015-02-11 18:22:18

回答

4

注意,當你說:

NSString *myString = [[NSString alloc] init]; 
^^^^^^^^^^    ^^^^^^^^ 

使用兩個不同的類型,NSString *NSString。所以,你要麼需要兩個類型定義:

typedef NSString String; 
typedef String *StringPtr; 

StringPtr newString = [[String alloc]init]; 

或一個類型定義,使間接明確:

typedef NSString String; 

String *newString = [[String alloc] init]; 
+0

您的代碼:typedef NSString String; typedef NSStringPtr * StringPtr; StringPtr newString = [[String alloc] init];產生錯誤,第二個代碼段工作正常,謝謝。但是NSString *和NSString有什麼區別呢?不*符號只是指針的聲明? – 2015-02-11 11:11:09

+0

對不起 - 第一個例子中存在拼寫錯誤 - 現在已修復。 – 2015-02-11 11:12:15

+0

謝謝保羅,我看到如何解決它,但仍然沒有真正明白NSString *和Nsstring之間有什麼區別。 – 2015-02-11 11:14:22