第五章账阻、oc的語言中級階段

Day17.protocol協(xié)議和NSString字符串的用法

1符相,protocol基本概念

#import <Foundation/Foundation.h>

@protocol SportProtocol <NSObject>
// 方法聲明列表
- (void)playFootball;
- (void)playBasketball;
- (void)playBaseball;
@end

2,protocol注意點(diǎn)

  • SportProtocol.h
#import <Foundation/Foundation.h>

@protocol SportProtocol <NSObject>
// 1.協(xié)議只能聲明方法, 不能聲明屬性
//{
//    int  _age;
//}

// 方法聲明列表
// 注意: 如果沒有使用任何關(guān)鍵字修飾協(xié)議中的方法, 那么該方法默認(rèn)就是required的
@required
// 如果協(xié)議中的方法是@required的, 而遵守協(xié)議的類又沒有實(shí)現(xiàn)該方法, 那么會報(bào)一個(gè)警告
- (void)playFootball;
@optional // 可選
// 如果協(xié)議中的方法是@optional的, 而遵守協(xié)議的類又沒有實(shí)現(xiàn)該方法, 那么不會報(bào)警告
- (void)playBasketball;
- (void)playBaseball;
// 注意:@required和@optional僅僅使用程序員之間交流, 并不能嚴(yán)格的控制某一個(gè)遵守該協(xié)議的類必須要實(shí)現(xiàn)該方法, 因?yàn)榧幢悴皇菍?shí)現(xiàn)也不會報(bào)錯(cuò), 只會報(bào)一個(gè)警告
@end
  • CrazySportProtocol.h
#import <Foundation/Foundation.h>
#import "SportProtocol.h"

// 4.OC中的協(xié)議又可以遵守其它協(xié)議, 只要一個(gè)協(xié)議遵守了其它協(xié)議, 那么這個(gè)協(xié)議中就會自動包含其它協(xié)議的聲明
@protocol CrazySportProtocol <SportProtocol>
// 跳樓
- (void)jumping;
@end
  • StudyProtocol.h
#import <Foundation/Foundation.h>

@protocol StudyProtocol <NSObject>

- (void)study;
@end
  • Person.h
#import <Foundation/Foundation.h>
#import "SportProtocol.h"
#import "StudyProtocol.h"

// 3.在OC中一個(gè)類可以遵守1個(gè)或多個(gè)協(xié)議
// 注意: OC中的類只能有一個(gè)父類, 也就是說OC只有單繼承
@interface Person : NSObject<SportProtocol, StudyProtocol>

@end
  • Sutdent.h
#import "Person.h"

// 2.父類遵守了某個(gè)協(xié)議, 那么子類也會自動遵守這個(gè)協(xié)議
@interface Sutdent : Person
@end

3褒链,協(xié)議的應(yīng)用場景1-類型限定

  • 首先定義一個(gè)協(xié)議WifeCondition.h
#import <Foundation/Foundation.h>

@protocol WifeCondition <NSObject>
// 會做飯
- (void)cooking;
// 會洗衣服
- (void)washing;
// 有一份好工作
- (void)job;
@end
  • 定義一個(gè)Wife.h類
#import <Foundation/Foundation.h>
#import "WifeCondition.h"

@interface Wife : NSObject <WifeCondition>
@end


#import "Wife.h"
@implementation Wife
// 會做飯
- (void)cooking
{
    NSLog(@"%s", __func__);
}
// 會洗衣服
- (void)washing
{
    NSLog(@"%s", __func__);
}
// 有一份好工作
- (void)job
{
    NSLog(@"%s", __func__);
}
@end
  • main.m類
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Wife.h"
#import "WifeCondition.h"

int main(int argc, const char * argv[]) {

    Person *p = [Person new];
    // 1.協(xié)議的第一個(gè)應(yīng)用場景, 可以將協(xié)議寫在數(shù)據(jù)類型的右邊, 明確的標(biāo)注如果想給該變量賦值, 那么該對象必須遵守某個(gè)協(xié)議
//    Wife<WifeCondition> *w = [Wife new];
    Wife *w = [Wife new];
    p.wife = w;
    
    [p show];
    
    return 0;
}
  • 定義Person.h類
#import <Foundation/Foundation.h>
#import "Wife.h"

@interface Person : NSObject

// 媳婦
// 注意: 記住一點(diǎn), 類型限定是寫在數(shù)據(jù)類型的右邊的
@property (nonatomic, strong) Wife<WifeCondition> *wife;


- (void)show;

@end

#import "Person.h"

@implementation Person

- (void)show
{
//    注意: 雖然在接受某一個(gè)對象的時(shí)候, 對這個(gè)對象進(jìn)行了類型限定(限定它必須實(shí)現(xiàn)某個(gè)協(xié)議), 但是并不意味著這個(gè)對象就真正的實(shí)現(xiàn)了該方法. 所以每次在調(diào)用對象的協(xié)議方法時(shí)應(yīng)該進(jìn)行一次驗(yàn)證
    if ([self.wife respondsToSelector:@selector(cooking)]) {
        
        [self.wife cooking];
    }
    
    if ([self.wife respondsToSelector:@selector(washing)]) {
        
        [self.wife washing];
    }
    
    if ([self.wife respondsToSelector:@selector(job)]) {
        
        [self.wife job];
    }
}
@end

4唁情,協(xié)議的應(yīng)用場景2-代理設(shè)計(jì)模式

  • 首先定義一個(gè)BabyProtocol協(xié)議
#import <Foundation/Foundation.h>
@class Baby;

@protocol BabyProtocol <NSObject>
// 喂嬰兒吃東西
- (void)feedFood:(Baby *)baby;

// 哄嬰兒睡覺
- (void)hongBaby:(Baby *)baby;
@end
  • 重點(diǎn)Baby.h類
#import <Foundation/Foundation.h>
#import "BabyProtocol.h"

@class Nanny, Studnet;

/*
 什么是代理設(shè)計(jì)模式
 心相印和超市
 超市就是心相印的代理, 它可以幫助心相印賣紙巾
 也就是說, 代理也幫助另外一個(gè)類做一些事情
 
 代理設(shè)計(jì)模式的應(yīng)用場景
 1.當(dāng)A對象想監(jiān)聽B對象的一些變化時(shí), 可以使用代理設(shè)計(jì)模式
 保姆想監(jiān)聽嬰兒的變化, 那么保姆就可以成為嬰兒的代理, 當(dāng)嬰兒發(fā)生變化之后保姆就可以監(jiān)聽到
 
 2.當(dāng)B對象發(fā)生一些事情, 想通知A對象的時(shí)候, 可以使用代理設(shè)計(jì)模式
 嬰兒想通知保姆, 那么就可以 讓保姆成為嬰兒的代理, 只要保姆成為嬰兒的代理, 以后嬰兒發(fā)生變化就可以通知保姆
 
 3.當(dāng)對象A無法處理某些行為的時(shí)候,想讓對象B幫忙處理(讓對象B成為對象A的代理對象)
 嬰兒無法自己吃東西, 也無法自己入睡, 所以可以讓保姆幫忙處理. 只要讓保姆成為嬰兒的代理就可以幫嬰兒喂它吃東西和哄他睡覺
 */
@interface Baby : NSObject

// 饑餓程度
@property (nonatomic, assign) int hungry;
// 睡意
@property (nonatomic, assign) int sleep;

// 吃東西
- (void)food;
// 困了
- (void)sleepy;

// 讓嬰兒擁有一個(gè)保姆
//@property (nonatomic, strong) Nanny *nanny;
//@property (nonatomic, strong) Studnet *stu;

// 如果使用id類型來接收保姆, 如果將來換保姆了, 嬰兒類不用修改代碼
@property (nonatomic, strong) id<BabyProtocol> nanny;

@end



#import "Baby.h"
#import "Nanny.h"

@implementation Baby


- (void)food
{
    self.hungry += 5;
    NSLog(@"要吃東西 %i", self.hungry);
    // 通知保姆
    if ([self.nanny respondsToSelector:@selector(feedFood:)]) {
        
        [self.nanny feedFood:self];
    }
}

- (void)sleepy
{
    self.sleep += 5;
    NSLog(@"困了 %i", self.sleep);
    
    // 通知保姆
    if ([self.nanny respondsToSelector:@selector(hongBaby:)]) {
        
        [self.nanny hongBaby:self];
    }
}
@end
  • 代理類 和Nanny.h都一樣的實(shí)現(xiàn)方式
#import <Foundation/Foundation.h>
#import "BabyProtocol.h"
@class Baby;
@interface Nanny : NSObject <BabyProtocol>

/*
// 喂嬰兒吃東西
- (void)feedFood:(Baby *)baby;

// 哄嬰兒睡覺
- (void)hongBaby:(Baby *)baby;
 */
@end


#import "Nanny.h"
#import "Baby.h"

@implementation Nanny


- (void)feedFood:(Baby *)baby
{
    baby.hungry -= 10;
    NSLog(@"喂嬰兒吃東西 %i", baby.hungry);
}

- (void)hongBaby:(Baby *)baby
{
    baby.sleep += 10;
    NSLog(@"哄嬰兒睡覺 %i", baby.sleep);
}
@end
  • main.m類
int main(int argc, const char * argv[]) {
    // 1.創(chuàng)建嬰兒
    Baby *b = [Baby new];
    // 2.創(chuàng)建保姆
//    Nanny *n = [Nanny new];
    // 3.將保姆賦值給嬰兒呢
//    b.nanny = n;
    
    // 4.換保姆
//    Studnet *stu = [Studnet new];
//    b.nanny = stu;
    
    // 5.再次換保姆
//    Teacher *tea = [Teacher new];
//    b.nanny = tea;
    
    Dog *d = [Dog new];
    b.nanny = d;
    
    //4.嬰兒發(fā)飆
    [b food];
    [b sleepy];
     
    return 0;
}

5,代理設(shè)計(jì)模式練習(xí)

  • main類
#import <Foundation/Foundation.h>
#import "Person.h"
#import "LinkHome.h"
#import "LoveHome.h"

int main(int argc, const char * argv[]) {

    /*
     用代理實(shí)現(xiàn)學(xué)生找房子, 不具備找房子的能力
     所以學(xué)生可以找另一個(gè)對象來幫它找房子, 那么另一個(gè)對象就是學(xué)生的代理
     */
    Person *p = [Person new];
    
    LinkHome *lh = [LinkHome new];
    p.delegate = lh;
    
//    LoveHome *lh = [LoveHome new];
//    p.delegete = lh;
    
    
    [p findHourse];
    
    return 0;
}
  • StudentProtocol.h協(xié)議類
#import <Foundation/Foundation.h>

@protocol StudentProtocol <NSObject>

// 幫學(xué)生找房子
- (void)studentFindHourse;
@end
  • Person.h類
#import <Foundation/Foundation.h>
//#import "StudentProtocol.h"

/*
 協(xié)議的編寫規(guī)范:
 1.一般情況下, 當(dāng)前協(xié)議屬于誰, 我們就將協(xié)議定義到誰的頭文件中
 2.協(xié)議的名稱一般以它屬于的那個(gè)類的類名開頭, 后面跟上protocol或者delegate
 3.協(xié)議中的方法名稱一般以協(xié)議的名稱protocol之前的作為開頭
 4.一般情況下協(xié)議中的方法會將觸發(fā)該協(xié)議的對象傳遞出去
 
 5.一般情況下一個(gè)類中的代理屬于的名稱叫做 delegate
 
 6.當(dāng)某一個(gè)類要成為另外一個(gè)類的代理的時(shí)候, 
   一般情況下在.h中用@protocol 協(xié)議名稱;告訴當(dāng)前類 這是一個(gè)協(xié)議.
    在.m中用#import真正的導(dǎo)入一個(gè)協(xié)議的聲明
 */

@class Person;

@protocol PersonProtocol <NSObject>

- (void)personFindHourse:(Person *)person;

@end

@interface Person : NSObject

//@property (nonatomic, strong) id<StudentProtocol> delegete;
@property (nonatomic, strong) id<PersonProtocol> delegate;

- (void)findHourse;
@end


#import "Person.h"

@implementation Person

- (void)findHourse
{
    NSLog(@"學(xué)生想找房子");
    // 通知代理幫他找房子
    if ([self.delegate respondsToSelector:@selector(personFindHourse:)]) {
        [self.delegate personFindHourse:self];
    }
}

@end
  • LinkHome.h類
#import <Foundation/Foundation.h>
//#import "Person.h"

@protocol PersonProtocol;

@interface LinkHome : NSObject <PersonProtocol>

@end


#import "LinkHome.h"
#import "Person.h"

@implementation LinkHome

- (void)personFindHourse:(Person *)person
{
    NSLog(@"%s", __func__);
}
@end

NSString和NSMutableString的用法

1甫匹,NSString的基本概念

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    //如何創(chuàng)建字符串對象
    /*
     通過不同的方式創(chuàng)建字符串,字符串對象儲存的位置也不一樣
     >如果是通過字符串常量創(chuàng)建,那么字符串對象存儲在常量區(qū)中
     >如果是通過alloc initWithFormat/stringWithFormat創(chuàng)建,那么字符串對象存儲在堆區(qū)中
     而且需要注意:
     >不同的平臺存儲的方式也不一樣,如果是Mac平臺系統(tǒng)會自動對字符串對象進(jìn)行優(yōu)化,但是如果是iOS平臺就是兩個(gè)對象
     >不同的編譯器存儲的方式也不一樣,如果是Xcode6以下并且是在iOS平臺,那么每次alloc都會創(chuàng)建一個(gè)新的對象,如果是在Xcode6以上那么alloc多次指向同一塊存儲空間
     
     */
    
    //1.通過字符串常量創(chuàng)建
    //注意:如果是通過字符串常量創(chuàng)建對象,并且字符串常量的內(nèi)容一致,那么如果創(chuàng)建多個(gè)字符串對象,多個(gè)對象指向同一塊存儲空間
    NSString *str1 = @"lnj";
    NSString *str11 = @"lnj";
    NSLog(@"str1 = %p, str11 = %p", str1 ,str11);
    
    //2.通過alloc init創(chuàng)建
    //只要調(diào)用alloc就會在堆內(nèi)存中開辟一塊存儲空間
    NSString *str2 = [[NSString alloc]initWithFormat:@"lmj"];
    NSString *str22 = [[NSString alloc]initWithFormat:@"lmj"];
    NSLog(@"str2 = %p, str22 = %p", str2, str22);
    
    //3.通過類工廠方法創(chuàng)建/ stringWithFormat
    //內(nèi)部其實(shí)就是封裝了alloc init
    NSString *str3 = [NSString stringWithFormat:@"zs"];
    NSString *str33= [NSString stringWithFormat:@"zs"];
    
    /*
     注意:一般情況下,只要是通過alloc或者類工廠方法創(chuàng)建的對象,每次都會在堆內(nèi)存中開辟一塊新的存儲空間
     但是如果是通過alloc的initWithString方法除外,因?yàn)檫@個(gè)方法是通過copy返回一個(gè)字符串對象給我們
     而copy又分為深拷貝和淺拷貝,如果是深拷貝會創(chuàng)建一個(gè)新的對象,如果是淺拷貝不會創(chuàng)建一個(gè)新的對象,而是直接返回被拷貝的對象的地址給我們
     */
    
    NSString *str4 = [[NSString alloc]initWithString:@"ls"];
    NSString *str44 = [[NSString alloc]initWithString:@"ls"];
    NSLog(@"str4 = %p, str44 = %p", str4, str44);

    return 0;
}

2甸鸟,字符串的讀寫

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    /*
     file: 文件路徑,
     encoding: 編碼英文 iOS-5988-1 中文 GBK GBK2312 , 一般情況填寫UTF-8
     error: 如果讀取錯(cuò)誤, 會將錯(cuò)誤信息保存到error中 ,如果讀取正確, 就沒有error = nil
     注意: 以后在OC方法中但凡看到XXXofFile的方法, 傳遞的一定是全路徑(絕對路徑)
     */
    NSString *path = @"/Users/xiaomage/Desktop/課堂共享/day17/note/lnj.txt";
    NSError *error = nil;
    
    // 從文件中讀取字符串
    /*
    NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
    if (error == nil) {
        
        NSLog(@"str = %@", str);
    }else
    {
        NSLog(@"error = %@", [error localizedDescription]);
    }
    */
    
    /*
     
    // 將字符串寫入到文件中
    NSString *str = @"iOS0601基礎(chǔ)班";
    // atomically 如果傳入YES, 字符串寫入文件的過程中如果沒有寫完, 那么不會生成文件
    //            如果傳入NO, 字符串寫入文件的過程中如果沒有寫完, 會生成文件
    NSString *path2 = @"/Users/xiaomage/Desktop/abc.txt";
    BOOL flag = [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"flag = %i", flag);
     */
    return 0;
}
  • URL路徑的path
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    //1.文件讀取
    /*
     //1.創(chuàng)建URL
     //協(xié)議頭 + 主機(jī)地址 + 文件路徑
     //    NSString *path = @"file://192.168.199.199/Users/NJ-Lee/Desktop/lnj.txt";
     //    NSString *path = @"http://www.baidu.com";
     
     //注意:如果加載的資源是本機(jī)上的資源,那么URL中的主機(jī)地址可以省略
     //雖然主機(jī)地址可以省略,但是需要注意,文件路勁中最前面的/不能省略,文件路徑最前面的/代表根路徑
     //    NSString *path = @"file:///Users/NJ-Lee/Desktop/lnj.txt";
     //    NSURL *url = [NSURL URLWithString:path];
     
     //    NSString *path = @"file:///Users/NJ-Lee/Desktop/lnj.txt";
     //注意:如果是通過NSURL的fileURLWithPath:方法創(chuàng)建URL,那么系統(tǒng)會自動給我們傳入的字符串添加協(xié)議頭(file://),所以字符串中不需要再寫file://
     //    注意:開發(fā)中一 般情況下,如果是訪問本機(jī)的資源,創(chuàng)建URL的時(shí)候,建議使用fileURLWithPath方法創(chuàng)建
     //因?yàn)閡rl不支持中文,如果URL中包含中文,那么無法訪問;但是如果是通過fileURLWithString方法創(chuàng)建URL,哪怕URL中包含中文也可以進(jìn)行訪問,系統(tǒng)內(nèi)部會自動對URL中包含的中文進(jìn)行處理
     //    NSURL *url = [NSURL fileURLWithPath:path];
     
     NSString *path = @"file:///Users/NJ-Lee/Desktop/未命名文件夾/lnj.txt";
     //如果URL中包含中文,又非不通過fileURLWithPath創(chuàng)建,也可以破
     //如果想破就必須在創(chuàng)建URL之前先對字符串中的中文進(jìn)行處理,進(jìn)行百分號編碼
     NSLog(@"處理前:%@", path);
     path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
     NSLog(@"處理后:%@", path);
     
     NSURL *url = [NSURL URLWithString:path];
     NSLog(@"url = %@", url);
     
     //2.根據(jù)URL加載文件中的字符串
     NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
     
     NSLog(@"str = %@", str);
     
     */
    
    //2.文件寫入
    NSString *str = @"lnj";
    //    NSString *path = @"file:///Users/NJ-Lee/Desktop/未命名文件夾/abc.txt";
    //    path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //    NSURL *url = [NSURL URLWithString:path];
    
    NSString *path = @"/Users/NJ-Lee/Desktop/未命名文件夾/abc.txt";
    NSURL *url = [NSURL fileURLWithPath:path];
    [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    //注意點(diǎn):如果多次往同一個(gè)文件中寫入內(nèi)容,那么后一次的會覆蓋前一次的
    NSString *str2 = @"xxoo";
    [str2 writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
    return 0;
}

3,字符串的比較

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    NSString *str1 = @"abc";
    NSString *str2 = @"ABC";
    
    /*
    // 比較兩個(gè)字符串的"內(nèi)容"是否相同
    BOOL flag = [str1 isEqualToString:str2];
    NSLog(@"flag = %i", flag);
    
    // 下面這個(gè)方法, 是比較兩個(gè)字符串的"地址"是否相同
    flag = (str1 == str2);
    NSLog(@"flag = %i", flag);
     */
    
    // 比較字符串的大小
    /*
    // NSOrderedAscending  前面的小于后面的
    // NSOrderedSame,  兩個(gè)字符串相等
    // NSOrderedDescending  前面的大于后面的
    switch ([str1 compare:str2]) {
        case NSOrderedAscending:
            NSLog(@"str1小于str2");
            break;
        case NSOrderedSame:
            NSLog(@"str1等于str2");
            break;
        case NSOrderedDescending:
            NSLog(@"str1大于str2");
            break;
        default:
            break;
    }
     */
    
    /*
    // 忽略大小寫進(jìn)行比較
    switch ([str1 caseInsensitiveCompare:str2]) {
        case NSOrderedAscending:
            NSLog(@"str1小于str2");
            break;
        case NSOrderedSame:
            NSLog(@"str1等于str2");
            break;
        case NSOrderedDescending:
            NSLog(@"str1大于str2");
            break;
        default:
            break;
    }
     */
    return 0;
}

4,字符串搜索

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

//    NSString *str = @"http://www.520it.com/img/lnj.gif";
    // 1.判斷是否以什么開頭
    /*
    // 本質(zhì)就是從字符串的第一個(gè)字符開始匹配, 只要不匹配就返回NO
    if ([str hasPrefix:@"http://"]) {
        NSLog(@"是一個(gè)URL");
    }else
    {
        NSLog(@"不是一個(gè)URL");
    }
     */
    
    // 2.判斷是否以什么結(jié)尾
    /*
    // 本質(zhì)就是從字符串的最后一個(gè)字符開始匹配, 只要不匹配就返回NO
    if ([str hasSuffix:@".gif"]) {
        NSLog(@"動態(tài)圖片");
    }else{
        NSLog(@"不是動態(tài)圖片");
    }
     */
    
    // 3.判斷字符串中是否包含520it.com
    /*
    NSString *str = @"abcd";
    // 只要str中包含該字符串, 那么就會返回該字符串在str中的起始位置以及該字符串的長度
    // location從0開始 , length從1開始
    // 如果str中沒有需要查找的字符串, 那么返回的range的length=0, location = NSNotFound
    NSRange range =  [str rangeOfString:@"lnj"];
//    if (range.location == NSNotFound) {
    if (range.length == 0){
        NSLog(@"str中沒有需要查找的字符串");
    }else{
        NSLog(@"str中有需要查找的字符串");
        NSLog(@"location = %lu, length = %lu", range.location, range.length);
    }
     */
    return 0;
}

5兵迅,字符串截取

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    NSString *str = @"<head>小碼哥</head>";
    /*
    // NSRange : 位置/長度
//    NSRange range = {6, 3};
//    NSRange range;
//    range.location = 6;
//    range.length = 3;
    // 只要是OC提供的結(jié)構(gòu)體, 一般都可以使用NSMakeXXX來創(chuàng)建
//    NSRange range = NSMakeRange(6, 3);
    */
    /*
    // 1.動態(tài)獲取截取的起始位置 值:6
    NSUInteger location = [str rangeOfString:@">"].location + 1;
    // 2.動態(tài)獲取截取的長度  值:3
    // 注意:rangeOfString是從左至右的開始查找, 只要找到就不找了
//    NSUInteger length = [str rangeOfString:@"<" options:NSBackwardsSearch].location - location;
    NSUInteger length = [str rangeOfString:@"</"].location - location;
    NSLog(@"location = %lu, length = %lu", location, length);
    NSRange range = NSMakeRange(location, length);
    NSString *newStr = [str substringWithRange:range];
    NSLog(@"str = %@", str);
    NSLog(@"newStr = %@", newStr);
   
    
//    NSString *temp = @"abcdefa";
//    NSRange range =[temp rangeOfString:@"a" options:NSBackwardsSearch];
//    NSLog(@"%lu", range.location);
     */
    
    // 從什么地方開始截取, 一直截取到最后
//    NSString *newStr = [str substringFromIndex:6];
//    NSLog(@"newStr = %@", newStr);
    // 從開頭開始截取, 一直截取到什么位置
//    NSString *newStr = [str substringToIndex:6];
//    NSLog(@"newStr = %@", newStr);
    
    /*
     <head>小碼哥</head> --> 小碼哥</head>  --> 小碼哥
     <head>小碼哥</head> --> <head>小碼哥  --> 小碼哥
    */
    NSLog(@"str = %@", str);
    NSUInteger location = [str rangeOfString:@">"].location + 1;
    NSString *newStr = [str substringFromIndex:location];
    NSLog(@"newStr = %@", newStr);
    
    location = [newStr rangeOfString:@"</"].location;
    // 改變了指針的指向, 并不是修改了原來的字符串
    newStr = [newStr substringToIndex:location];
    NSLog(@"newStr = %@", newStr);
    
    return 0;
}

6抢韭,字符串替換

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    /*
    // 需求: 將&符號替換為/
    NSString *str = @"http:&&www.520it.com&img&lnj.gif";
    
    // OccurrencesOfString: 要替換誰
    // withString: 用誰替換
    NSString *newStr = [str stringByReplacingOccurrencesOfString:@"&" withString:@"/"];
    NSLog(@"newStr = %@", newStr);
     */
    
    /*
    // 1.去除空格  2.將&替換為/
    NSString *str = @"   http:   &&www.   520it.com   &img&lnj.gif   ";
    // 1.去除空格
    NSString *newStr = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog(@"newStr = |%@|", newStr);
    NSString *newStr2 = [newStr stringByReplacingOccurrencesOfString:@"&" withString:@"/"];
    NSLog(@"newStr2 = |%@|", newStr2);
     */
    
    // 3.替換首尾 set的用法 專門去除首尾的空格,大恍箭,小寫字母刻恭,*號等等
    
//    NSString *str = @"   http:&&www.520it.com&img&lnj.gif   ";
    NSString *str = @"HTTP://www.520it.com/img/LNJ.GIF";
//    NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet]; 去首尾的空格
//    NSString *newStr = [str stringByTrimmingCharactersInSet:set];
//    去除首尾的大寫字母
    NSCharacterSet *set = [NSCharacterSet uppercaseLetterCharacterSet];
    NSString *newStr = [str stringByTrimmingCharactersInSet:set];
    NSLog(@"newStr = |%@|", newStr);
    
    return 0;
}

7,字符串與路徑

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    NSString *str = @"User/lnj/Desktop/lnj.txt.jpg";
    // 1.判斷是否是絕對路徑
    /*
    // 其實(shí)本質(zhì)就是判斷字符串是否以/開頭
    if([str isAbsolutePath])
    {
        NSLog(@"是絕對路徑");
    }else{
        NSLog(@"不是絕對路徑");
    }
     */
    
    // 2.獲取文件路徑中的最后一個(gè)目錄
    // 本質(zhì)就是獲取路徑中最后一個(gè)/后面的內(nèi)容
    /*
    NSString *newStr = [str lastPathComponent];
    NSLog(@"%@", newStr);
     */
    
    // 3.刪除文件路徑中的最后一個(gè)目錄
    /*
    // 本質(zhì)就是刪除最后一個(gè)/后面的內(nèi)容, 包括/也會被刪除
    NSString *newStr = [str stringByDeletingLastPathComponent];
    NSLog(@"%@", newStr);
     */
    
    // 4.給文件路徑添加一個(gè)目錄
    /*
     // 本質(zhì)就是在字符串的末尾加上一個(gè)/ 和指定的內(nèi)容
     // 注意: 如果路徑后面已經(jīng)有了/, 那么就不會添加了
     //      如果路徑后面有多個(gè)/, 那么會自動刪除多余的/, 只保留一個(gè)
     NSString *newStr = [str stringByAppendingPathComponent:@"xmg"];
     NSLog(@"%@", newStr);
     */
    
    // 5.獲取路徑中文件的擴(kuò)展名
    /*
    // 本質(zhì)就是從字符串的末尾開始查找., 截取第一個(gè).后面的內(nèi)容
    NSString *newStr = [str pathExtension];
    NSLog(@"%@", newStr);
     */
    
    // 6.刪除路徑中文件的擴(kuò)展名
    /*
    // 本質(zhì)就是從字符串的末尾開始查找.,刪除第一個(gè).和.后面的內(nèi)容
    NSString *newStr = [str stringByDeletingPathExtension];
    NSLog(@"%@", newStr);
     */
    
    // 7.給文件路徑添加一個(gè)擴(kuò)展名
    // 本質(zhì)就是在字符串的末尾加上一個(gè).和指定的內(nèi)容
    NSString *newStr = [str stringByAppendingPathExtension:@"jpg"];
    NSLog(@"%@", newStr);
    
    return 0;
}

8季惯,字符串的轉(zhuǎn)換

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

//    NSString *str = @"abc";
    
    // 1.將字符串轉(zhuǎn)換為大寫
    /*
    NSString *newStr = [str uppercaseString];
    NSLog(@"%@", newStr);
    */
    // 2.將字符串轉(zhuǎn)換為小寫
    /*
    NSString *newStr2 = [newStr lowercaseString];
    NSLog(@"%@", newStr2);
    
//    htpp://www.520it.com/img/lnj.GIF;
    */
    
    // 3.將字符串的首字符轉(zhuǎn)換為大寫
    /*
    NSString *newStr = [str capitalizedString];
    NSLog(@"%@", newStr);
     */
    
    // 4.字符串與基本數(shù)據(jù)類型的轉(zhuǎn)換
    /*
    NSString *str1 = @"110";
    NSString *str2 = @"120";
//    str1 + str2; // 錯(cuò)誤
    int value1 = [str1 intValue];
    int value2 = [str2 intValue];
    NSLog(@"sum = %i", value1 + value2);
    
    // 注意: 如果不是int,double,float,bool,integer,longlong這些類型就不要亂用
    NSString *str3 = @"abc";
    int value3 = [str3 intValue];
    NSLog(@"value3 = %i", value3);
     */
    
    // 5.C語言字符串和OC字符串之間的轉(zhuǎn)換
    /*
    char *cStr = "lnj";
    NSString *str = [NSString stringWithUTF8String:cStr];
    NSLog(@"str = %@", str);
    
    NSString *newStr = @"lmj";
    const char *cStr2 = [newStr UTF8String];
    NSLog(@"cStr2 = %s", cStr2);
     
     */
    return 0;
}

9吠各,NSMutableString基本概念

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    /*
    NSString *str = @"lnj"; // 一開始str指向@"lnj"對應(yīng)的內(nèi)存
    str = @"lmj"; // 修改了str指針的指向, 讓它指向@"lmj"對應(yīng)的內(nèi)存
    NSString *newStr = [str stringByReplacingOccurrencesOfString:@"l" withString:@"X"];
    NSLog(@"%@", newStr);
    */
    
    // 創(chuàng)建一個(gè)空的字符串
    NSMutableString *str = [NSMutableString string];
    NSLog(@"修改前: %@", str);
    [str appendString:@"lnj"];
    NSLog(@"修改后: %@", str);
    
    NSMutableString *strM = [[NSMutableString alloc] init];
//    strM = [NSMutableString alloc] initWithFormat:<#(NSString *), ...#>
//    strM = [NSMutableString stringWithFormat:<#(NSString *), ...#>]
    
    return 0;
}

10,NSMutableString常用方法

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    NSMutableString *strM = [NSMutableString stringWithFormat:@"www.520it.com.520"];
    
    // 1.在字符串后面添加/image
    /*
    [strM appendString:@"/image"];
//    [strM appendFormat:@"/age is %i", 10];
    NSLog(@"strM = %@", strM);
    */
    // 2.刪除字符串中的520
    /*
    // 技巧: 在開發(fā)中, 我們經(jīng)常利用rangeOfString和deleteCharactersInRange方法配合起來刪除指定的字符串
    // 2.1先查找出520在字符串中的位置
    NSRange range = [strM rangeOfString:@"520"];
    // 2.2刪除520
    [strM deleteCharactersInRange:range];
    NSLog(@"strM = %@", strM);
     */
    
    // 3.在520前面插入love這個(gè)單詞
    /*
    // insertString : 需要插入的字符串
    // atIndex: 從哪里開始插入
    NSRange range = [strM rangeOfString:@"520"];
    [strM insertString:@"love" atIndex:range.location];
    NSLog(@"strM = %@", strM);
     */
    
    // 4.要求將字符串中的520替換為530
    // 注意: 如果是調(diào)用NSString的字符串替換方法, 不會修改原有字符串, 而是生成一個(gè)新的字符串
//    NSString *newStr =[strM stringByReplacingOccurrencesOfString:@"520" withString:@"530"];
    
    // 注意: 一般情況下OC方法要求傳入一個(gè)參數(shù)如果沒有*, 大部分都是枚舉
    //      一般情況下如果不想使用枚舉的值, 可以傳入0, 代表按照系統(tǒng)默認(rèn)的方式處理
    // OccurrencesOfString: 需要替換的字符串
    // withString: 用什么替換
    // options: 替換時(shí)的搜索方式
    // range: 搜索的范圍
    // 返回值: 代表替換了多少個(gè)字符串
    NSUInteger count = [strM replaceOccurrencesOfString:@"520" withString:@"530" options:0 range:NSMakeRange(0, strM.length)];
    NSLog(@"strM = %@", strM);
    NSLog(@"count = %lu", count);
    
//    NSLog(@"newStr = %@", newStr);
    
    return 0;
}

11勉抓,NSMutableString的練習(xí)

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    /*
     需求: 將3個(gè)520it拼接在一起, 中間用空格隔開
     520it 520it 520it
     */
    
    NSString *subStr = @"520it";
    /*
    // 520it-
    NSString *newStr = [subStr stringByAppendingString:@" "];
    // 520it-520it
    newStr = [newStr stringByAppendingString:subStr];
    // 520it-520it-
    newStr = [newStr stringByAppendingString:@" "];
    // 520it-520-520it
    newStr = [newStr stringByAppendingString:subStr];
    */
    /*
    // 注意: 在開發(fā)中如果需要對字符串進(jìn)行頻繁的操作, 不要使用不可變的字符串
    NSString *newStr = [subStr stringByAppendingString:@" "];;
    for (int i = 0; i < 2; ++i) {
        newStr = [newStr stringByAppendingString:subStr];
        newStr = [newStr stringByAppendingString:@" "];
    }
    
//     多了一個(gè)空格贾漏,第一種做法是替換最后一個(gè)空格
//     第二種做法是去掉首尾的空格的set來做
//    newStr = [newStr stringByReplacingCharactersInRange:NSMakeRange(newStr.length -1 , 1) withString:@""];
    newStr = [newStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    NSLog(@"newStr = |%@|", newStr);
    */
    // 創(chuàng)建一個(gè)空得字符串
    NSMutableString *strM  = [NSMutableString string];
    for (int i = 0; i < 3; ++i) {
        // 1.添加一個(gè)520it
        [strM appendString:subStr];
        // 2.添加一個(gè)空格
        [strM appendString:@" "];
    }
    [strM deleteCharactersInRange:NSMakeRange(strM.length - 1, 1)];
    NSLog(@"strM = |%@|", strM);
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市藕筋,隨后出現(xiàn)的幾起案子纵散,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伍掀,死亡現(xiàn)場離奇詭異掰茶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蜜笤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門濒蒋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人把兔,你說我怎么就攤上這事沪伙。” “怎么了县好?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵围橡,是天一觀的道長。 經(jīng)常有香客問我缕贡,道長翁授,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任晾咪,我火速辦了婚禮收擦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好招刨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布礼饱。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天鳍置,我揣著相機(jī)與錄音,去河邊找鬼送淆。 笑死税产,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的偷崩。 我是一名探鬼主播辟拷,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阐斜!你這毒婦竟也來了衫冻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谒出,失蹤者是張志新(化名)和其女友劉穎隅俘,沒想到半個(gè)月后邻奠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡为居,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年碌宴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒙畴。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贰镣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膳凝,到底是詐尸還是另有隱情八孝,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布鸠项,位于F島的核電站,受9級特大地震影響子姜,放射性物質(zhì)發(fā)生泄漏祟绊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一哥捕、第九天 我趴在偏房一處隱蔽的房頂上張望牧抽。 院中可真熱鬧,春花似錦遥赚、人聲如沸扬舒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讲坎。三九已至,卻和暖如春愧薛,著一層夾襖步出監(jiān)牢的瞬間晨炕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工毫炉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓮栗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓瞄勾,卻偏偏與公主長得像费奸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子进陡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354