C#妹妹:哇,冤家路窄啊,這個不是Objective-C阿姨家的狗狗麼?
狗狗:日,到底誰跟誰是冤家。。
C#妹妹:不服氣呀~再給你弄一陀吃吃。。
view sourceprint?01 #import <Foundation/Foundation.h>
02 #import "Dog.h"
03
04 int main (int argc, const char * argv[])
05 {
06
07 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
08 Dog *d=[Dog new];
09 [d Eat:@"便便" EatQty:1];
10 [d release];
11 [pool drain];
12 return 0;
13 }
狗狗:
C#妹妹:操,升級啦,看姐姐我扒你的皮,毀你的源代碼。。
Objective-C阿姨:你這個小姑娘為啥總跟我狗狗過不去呀。
C#妹妹:它不吃屎也就罷了,還說什麼“你留著自己吃。。。”,肯定程序出問題了,我幫他調試一下。
Objective-C阿姨:就是怕你再害它,我昨天給他升級了。。。現在代碼是這個樣子。。
view sourceprint?01 #import "Dog.h"
02 @implementation Dog
03 -(void) Sound
04 {
05 NSLog(@"汪汪!");
06 }
07 BOOL isTrueFood(NSString *food)
08 {
09 NSRange r=[@",包子,骨頭,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]];
10 if(r.length>0)
11 return(YES);
12 else
13 return(NO);
14
15 }
16 -(void) Eat:(NSString *) food EatQty:(int) count
17 {
18 if(isTrueFood(food)==YES)
19 {
20 NSLog(@"吃%d斤%@",count,food);
21 }
22 else
23 {
24 NSLog(@"你留著自己吃吧。。。");
25 }
26 }
27 @end//Dog
C#妹妹:哇,我們天朝特色的敏感詞語過濾技術你都用上了。。。真是同一個世界,同一個噩夢啊。。。
Objective-C阿姨:,你能不能少貧點。。。。
C#妹妹:貌似其他都能看懂,除了這一句不太明白
view sourceprint?NSRange r=[@",包子,骨頭,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]];
Objective-C阿姨:這個語句裡邊就是用了兩個NSString的方法。一個是實例方法rangeOfString,一個是類方法stringWithFormat。NSString是Cocoa中用於字符串處理的類,比C原始的字符串數組方便了很多,就像.NET的String一樣,內置了很多方法。
rangeOfString:功能類似與.NET中的String.IndexOf,判斷一個字符串在另一個字符串中的位置,但是返回的類型是NSRange,而不是數字
NSRange的定義估計你一看就知道怎麼回事了
view sourceprint?1 typedef struct _NSRange {
2 NSUInteger location;//起始位置
3 NSUInteger length;//長度
4 } NSRange;
其實NSRange.location就相當於.NET中String.IndexOf的返回值。
C#妹妹:但是.NET中如果IndexOf檢索不到相應的內容,返回負數,而這個location是NSUInteger類型,看起來這個類型是一種無符號整數啊,如何表示檢索不到內容呢?
Objective-C阿姨:有兩種方法可以解決這個問題。一種是判斷length的長度,如果長度為0,表示沒有找到相應的內容,另外一種判斷location是否等於NSNotFound。其實NSNotFound就是NSUInteger的最大值LONG_MAX
C#妹妹:挺經典的,.NET裡用負數表示檢索不到內容,Objective-C裡邊用最大值表示。
Objective-C阿姨:是的,rangeOfString的用法類似這樣
view sourceprint?1 NSString *word=@"tive";
2 NSString *str=@"這是Objective-C家的狗狗!";
3 NSLog(@"在字符串‘%@’中搜索‘%@’",str,word);
4 NSRange r=[str rangeOfString:word];//在str中搜索word 返回NSRange 裡邊包含{location和length}
5 if(r.location==NSNotFound)//這裡判斷if(r.length<=0)也是一樣的
6 NSLog(@"這句話裡沒有找到%@",word);
7 else
8 NSLog(@"這句話中從第%lu個字符開始後邊%lu個字符是%@",r.location+1,r.length,word);
rangeOfString還可以有個參數 判斷是否區分大小寫什麼的。比如可以這樣用
view sourceprint?NSRange r=[str rangeOfString:word options:NSCaseInsensitiveSearch];//NSCaseInsensitiveSearch表示不區分大小寫
如果看著還有點暈,再回顧一次Objective-C給對象發送消息的方式吧
另外一個用到的函數
stringWithFormat:功能類似與.NET中的string.Format,也同樣都是類方法,都是用來生成字符串的。用法你看看下面的例子
view sourceprint?NSString *str2=[NSString stringWithFormat:@"%@愛吃%@",@"狗狗",@"包子"]; NSLog(@"%@",str2);//這句話輸出 狗狗愛吃包子
弄明白這兩個方法,現在在看下面的語句應該就明白了吧。
view sourceprint?NSRange r=[@",包子,骨頭,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]];
其實是兩個方法的嵌套
先向NSString類發送消息stringWithFormat生成食物名稱的字符串,比如@“,包子,”
然後再向字符串@",包子,骨頭,肉,冰激凌,"其實也就是NSString的實例發送消息rangeOfString檢索@“,包子,”是否包含在字符串@",包子,骨頭,肉,冰激凌,"中。
C#妹妹:好一段糾結的代碼。。。。
Objective-C阿姨:現在就比較一下NSString與.NET中的System.String吧。
關於字符串長度。
NSString用方法length方法。System.String有Length屬性。兩者都充分考慮到中文字符的問題,不論英文還是中文日本,每個字符長度加1。
關於字符串比較。Objective-C不能用“==”號,比較字符串內容的,“==”保留了原始的引用比較功能。C#已經把“==”處理成比較直觀的內容比較。Objective-C中比較字符串是否相同正確的方法是isEqualToString。
與.NET的System.String相同,NSString同樣是不可變的
NSString所謂的改變就是生成新的字符串。與.NET的String.Text.StringBuilder一樣,Objective-C提供了NSMutableString,這個類表示的字符串是可以修改的。但是與StringBuilder不同的是,他繼承自NSString,意味著基類的方法,他都可以用。
各位同學,本人學習Objective-C時間很短,學習Objective-C其實不是為了Mac、iPhone開發,並沒有實用,
其實是一個C#用戶學習Objective-C的學習筆記,學習的確切目的是幫助我理解C#,畢竟沒有比較是不可能知道所謂C#的特點的
請大家批判的眼光看這個東西,如果發現和其他文章、書籍、評論、資料有沖突,請盡量以其他文章為准。並給我留言
也邀請所有高手積極拍磚