OC學習篇之---Foundation框架中的NSString對象和NSMutableString對象 分類: IOS 2014-12-07 17:06 1815人閱讀 評論(1) 收藏

在以前的一篇文章中咱們說到了Foundation框架中的NSObject對象:html

http://blog.csdn.net/jiangwei0910410003/article/details/41788121java

那麼今天在在來繼續看一下Foundation框架中的經常使用對象:NSString和NSMutableStringios

在OC中NSString對象是不可變的,和Java中的String同樣的,而NSMutableString是可變的,和Java中的StringBuilder同樣。api


1、NSString對象app

在OC中,NSString對象是很是重要的一個對象,也是最基礎的一個對象,是用來處理字符串的經常使用類,和Java中的String類很是類似,並且他的一些方法也是很相似的。框架

直接來看一下NSString的一些方法的使用:iphone

//
//  main.m
//  14_NSString
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //NSString是不可變字符串,後面還會降到可變字符串
        
        //1.--------------字符串的建立方式
        NSString *string1 = @"hello";
        NSLog(@"%@",string1);
        //和上面的方式是等價的
        string1 = [[NSString alloc] initWithString:@"hello1"];
        NSLog(@"%@",string1);
        //佔位符,能夠實現拼接字符串
        //[string1 stringByAppendingFormat:<#(NSString *), ...#>]這個方法也是能夠實現字符串拼接的
        string1 = [[NSString alloc] initWithFormat:@"hello %@",string1];
        NSLog(@"%@",string1);
        //使用類方法建立字符串
        string1 = [NSString stringWithString:@"hello1"];
        
        
        //2.--------------字符串的比較isEqualToString
        //比較字符串的值
        NSString *string2 = @"abcd";
        NSString *string3 = @"8888";
        BOOL isEquals = [string2 isEqualToString:string3];
        if(isEquals){
        }else{
        }
        
        NSString *string8 = @"abc";
        NSString *string9 = @"abc";
        //這裏內存作了優化,這裏string8和string9是相同的,"abc"在常量區中分配的
        //string8和string9是局部變量,在棧中分配內存的
        if(string8 == string9){
            NSLog(@"string8 == string9");
        }else{
            NSLog(@"string8 != string9");
        }
        
        //下面的string11和string12仍是在棧中分配內存的
        NSString *string11 = [[NSString alloc] initWithString:@"abc"];
        NSString *string12 = [[NSString alloc] initWithString:@"abc"];
        if(string11 == string12){
            NSLog(@"string11 == string12");
        }else{
            NSLog(@"string11 != string12");
        }
        
        //下面的string13和string14是在堆中分配內存的,因此string13和string14不相等了
        NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
        NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
        if(string13 == string14){
            NSLog(@"string13 == string14");
        }else{
            NSLog(@"string13 != string14");
        }
        
        //3.---------------------caseInsensitiveCompare方法
        //區分大小寫判斷是否相等
        NSString *string15 = @"zhangsan";
        NSString *string16 = @"ZAHNGSAN";
        NSComparisonResult result = [string15 caseInsensitiveCompare:string16];
        if(result == NSOrderedSame){
        }else{
        }
        
        
        //4.---------------------compare方法
        //比較兩個字符串的大小
        result = [string15 compare:string16];
        if(result == NSOrderedAscending){
            //升序
        }else if(result == NSOrderedDescending){
            //降序
        }
        
        
        //5.---------------------length方法
        NSString *string17 = @"abc";
        NSInteger len = [string17 length];
        NSLog(@"len=%ld",len);
        
        
        //6.---------------------uppercaseString/lowercaseString
        //轉成大寫
        NSString *string18 = @"aEc";
        NSString *string19 = [string18 uppercaseString];
        string19 = [string18 lowercaseString];
        //首字符大寫,其餘的變成小寫
        [string18 capitalizedString];
        
        
        //7.---------------------TypeXXXValue
        //數值轉化方法
        NSString *string20 = @"3.14";
        float value = [string20 floatValue];
        string20 = @"1";
        BOOL values = [string20 boolValue];
        
        
        //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange
        //字符串的截取
        NSString *string21 = @"abcdefg";
        //從開始位置截取到下標爲3的字串(不包括3)
        NSString *stringnews = [string21 substringToIndex:3];
        //從哪一個index開始截取到尾部(包括3)
        stringnews = [string21 substringFromIndex:3];
        //截取1~(3+1)部分的字串
        NSRange range = {1,3};
        stringnews = [string21 substringWithRange:range];
        
        
        //9.----------------------stringByAppendingString/stringByAppendingFormat
        //字符串的追加
        NSString *string22 = @"Android";
        NSString *stringnew = [string22 stringByAppendingString:@"IOS"];
        stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];
        
        
        //10.---------------------rangeOfString
        //字符串的查找
        NSString *string23 = @"www.iphonetrain.com/ios.html";
        NSRange rang = [string23 rangeOfString:@"ios"];//返回一個範圍
        if(rang.location == NSNotFound){
            //沒找到
        }else{
            //找到了
        }
        
        //11.----------------------characterAtIndex
        //取出字符串中指定的char
        NSString *string24 = @"abcdef";
        unichar c = [string24 characterAtIndex:3];
    
        
    }
    return 0;
}


下面來看一下他的方法:

一、建立的方法優化

//1.--------------字符串的建立方式
NSString *string1 = @"hello";
NSLog(@"%@",string1);
//和上面的方式是等價的
string1 = [[NSString alloc] initWithString:@"hello1"];
NSLog(@"%@",string1);
//佔位符,能夠實現拼接字符串
//[string1 stringByAppendingFormat:<#(NSString *), ...#>]這個方法也是能夠實現字符串拼接的
string1 = [[NSString alloc] initWithFormat:@"hello %@",string1];
NSLog(@"%@",string1);
//使用類方法建立字符串
string1 = [NSString stringWithString:@"hello1"];
這裏用了四種方式去建立一個字符串

咱們經常使用的方式通常是第一種ui

第二種是對象方法建立的spa

第三種是在建立字符串的時候能夠實現字符串的拼接

第四種是使用類的方法建立的


二、比較字符串的值

//2.--------------字符串的比較isEqualToString
//比較字符串的值
NSString *string2 = @"abcd";
NSString *string3 = @"8888";
BOOL isEquals = [string2 isEqualToString:string3];
if(isEquals){
}else{
}
這個方法簡單,沒什麼好說的

可是這個方法要和咱們以前說到的==方式判斷相等的方式區分,==和isEqual方法同樣,比較指針變量是否指向同一個對象的,可是在OC中對於字符串有一個特殊的地方,下面來看一下代碼:

NSString *string8 = @"abc";
NSString *string9 = @"abc";
//這裏內存作了優化,這裏string8和string9是相同的,"abc"在常量區中分配的
//string8和string9是局部變量,在棧中分配內存的
if(string8 == string9){
    NSLog(@"string8 == string9");
}else{
    NSLog(@"string8 != string9");
}
這裏咱們運行以後,發現用==判斷也是相等的,這個緣由和Java中的情形很類似,在Java中有一個常量池的概念,像這種方式建立的字符串,他們的值都是保存在一個常量池的,而後引用都是指向常量池中的那個對象,因此用==也是相等的,OC中的緣由也是相似。

可是在來看一下下面的代碼:

//下面的string11和string12仍是在棧中分配內存的
NSString *string11 = [[NSString alloc] initWithString:@"abc"];
NSString *string12 = [[NSString alloc] initWithString:@"abc"];
if(string11 == string12){
    NSLog(@"string11 == string12");
}else{
    NSLog(@"string11 != string12");
}
咱們發現用initWithString初始化方法建立的字符串他們的指針變量也是指向同一個對象的,因此這裏要記住了,NSString類中的initWithString方法建立的字符串和NSString *str = @"demo"直接建立的方式是同樣的,都是指向常量池中的一個對象。因此使用==判斷是相等的,其餘的NSString類中建立字符串的方法就不同了,好比下面的代碼:

//下面的string13和string14是在堆中分配內存的,因此string13和string14不相等了
NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
if(string13 == string14){
    NSLog(@"string13 == string14");
}else{
    NSLog(@"string13 != string14");
}
用initWithFormat初始化方法建立出來的對象就不想等了。

因此要記住一點:initWithString初始化方法和直接建立字符串的效果同樣,都是指向常量池中的NSString對象


三、比較兩個字符串的大小方法

//4.---------------------compare方法
//比較兩個字符串的大小
result = [string15 compare:string16];
if(result == NSOrderedAscending){
    //升序
}else if(result == NSOrderedDescending){
    //降序
}

四、字符串的長度的方法

//5.---------------------length方法
NSString *string17 = @"abc";
NSInteger len = [string17 length];
NSLog(@"len=%ld",len);


五、轉化字符串的大小寫方法
//6.---------------------uppercaseString/lowercaseString
//轉成大寫
NSString *string18 = @"aEc";
NSString *string19 = [string18 uppercaseString];
string19 = [string18 lowercaseString];
//首字符大寫,其餘的變成小寫
[string18 capitalizedString];

六、數值轉化的方法

//7.---------------------TypeXXXValue
//數值轉化方法
NSString *string20 = @"3.14";
float value = [string20 floatValue];
string20 = @"1";
BOOL values = [string20 boolValue];


七、字符串的截取方法

//8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange
//字符串的截取
NSString *string21 = @"abcdefg";
//從開始位置截取到下標爲3的字串(不包括3)
NSString *stringnews = [string21 substringToIndex:3];
//從哪一個index開始截取到尾部(包括3)
stringnews = [string21 substringFromIndex:3];
//截取1~(3+1)部分的字串
NSRange range = {1,3};
stringnews = [string21 substringWithRange:range];

八、字符串的追加方法

//9.----------------------stringByAppendingString/stringByAppendingFormat
//字符串的追加
NSString *string22 = @"Android";
NSString *stringnew = [string22 stringByAppendingString:@"IOS"];
stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];

這裏須要注意的是,每次追加完一個字符串以後,是返回一個新的字符串,由於NSString是不可變類。和Java中的String類很相似,若是用+去鏈接字符串都會從新建立一個字符串對象,Java中可使用StringBuilder對象去解決這樣的問題,在OC中也是有解決的,後面會說到一個可變字符串類


九、字符串的查找方法

//10.---------------------rangeOfString
//字符串的查找
NSString *string23 = @"www.iphonetrain.com/ios.html";
NSRange rang = [string23 rangeOfString:@"ios"];//返回一個範圍
if(rang.location == NSNotFound){
    //沒找到
}else{
    //找到了
}


十一、取出字符串中指定的char

//11.----------------------characterAtIndex
//取出字符串中指定的char
NSString *string24 = @"abcdef";
unichar c = [string24 characterAtIndex:3];


2、NSMutableString對象

上面介紹了NSString對象的一些經常使用方法,可是OC中的NSString是不可變的對象,因此這裏在介紹一下一個與其對應的可變對象:

NSMutableString

看一下代碼:

//
//  main.m
//  15_NSMutableString
//
//  Created by jiangwei on 14-10-12.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

//NSMutableString中的內容是能夠修改的
//NSMutableString是繼承NSString類的
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //1.--------------------建立字符串
        //和NSString的建立方法相同
        NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"hello"];
        
        //可是不能使用如下方式建立
        //由於如下方式建立的字符串是不可變的,其值是放到常量池中的,不可變得
        //NSMutableString *string1 = @"hello";
        
        
        //2.---------------------insertString
        //在源字符串中指定的index中插入字符串,不會產生新的對象
        [string1 insertString:@"可變" atIndex:0];
        
        
        //3.---------------------appendString
        //追加字符串,不會產生新的對象
        [string1 appendString:@"可變"];
        
        
        //4.---------------------deleteCharactersInRange
        //刪除字符串中指定範圍的字串內容
        NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];
        NSRange range = {1,3};
        [string2 deleteCharactersInRange:range];
        
        
        //5.---------------------replaceCharactersInRange
        //替換字符串內容
        NSMutableString *string3 = [NSMutableString stringWithString:@"hello"];
        NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出須要替換字符串的範圍
        [string3 replaceCharactersInRange:ranges withString:@"ee"];
    }
    return 0;
}
這裏主要是介紹了NSMutalbeString類和NSString類不一樣的地方


一、建立方法

NSMutableString類的建立方式和NSString的建立方式差很少,只是有一點須要注意,NSMutableString不能使用直接方式去建立,由於直接方式建立的字符串都是在常量池中,而常量池中的值都是不可變的,因此不能建立的,同時initWithString建立出來的字符串也是不在常量池中的。這點須要和NSString區分一下


二、在字符串中插入一個字串

//2.---------------------insertString
//在源字符串中指定的index中插入字符串,不會產生新的對象
[string1 insertString:@"可變" atIndex:0];

三、字符串的追加

//3.---------------------appendString
//追加字符串,不會產生新的對象
[string1 appendString:@"可變"];
這個追加方法和NSString是不同的,他不會產生一個字符串對象


四、刪除字串

//4.---------------------deleteCharactersInRange
//刪除字符串中指定範圍的字串內容
NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];
NSRange range = {1,3};
[string2 deleteCharactersInRange:range];

五、替換字符串
//5.---------------------replaceCharactersInRange
//替換字符串內容
NSMutableString *string3 = [NSMutableString stringWithString:@"hello"];
NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出須要替換字符串的範圍
[string3 replaceCharactersInRange:ranges withString:@"ee"];


從上面的這些方法中,咱們也能夠看到NSMutableString類是可變的,由於只有可變字符串是有增刪改查操做的


總結

這篇文章就介紹了Foundation框架中的字符串對象,有可變NSMutableString和不變NSString之分。

相關文章
相關標籤/搜索