IOS學(xué)習(xí)筆記之Object-C(二)

+Category分類(類擴(kuò)展)
可以動態(tài)的為已經(jīng)存在的類添加新的方法(但不能添加成員變量)镜硕;(Xcode中新建-Object-C file-選擇category;)[可以和頭文件寫在同一個(gè)文件中(一個(gè)文件中可有多個(gè)類)]
不需要?jiǎng)?chuàng)建子類奕扣;實(shí)現(xiàn)的方法的模塊化;

 //需要導(dǎo)入要擴(kuò)展的類的頭文件;
#import “Student.h"
//類名后有一個(gè)()就代表著是一個(gè)分類肾请;
//(..)中的內(nèi)容就是分類的名稱练慕;
@interface Student (addFound)
-(void)test2;//擴(kuò)展的方法聲明
@end

使用場景:需求變更;對系統(tǒng)基礎(chǔ)類庫進(jìn)行擴(kuò)展译红;

+protocol
概念:就是一系實(shí)現(xiàn)方法的列表预茄,其中聲明的方法可以被任何類實(shí)現(xiàn),這種模式稱為代理(delegation)模式(同Java中的接口);
(在iOS和OS x開了中耻陕,采用了大量的代理模式來實(shí)現(xiàn)MVC中的View(UI控件)和Controller(控制器)的解耦拙徽,如按鈕監(jiān)聽);
[命名規(guī)范 **Delegate,如ButtonDelegate;]
在頭文件中定義:

@class Button;
//<>代表實(shí)現(xiàn)了某個(gè)協(xié)議(類似于java中該接口繼承了另一個(gè)接口)
@protocol ButtonDelegate <NSObject>
-(void)onClick:(Button *)button;//一般規(guī)范要添加調(diào)用的對象
@end
@interface Button : NSObject
//定義一個(gè)按鈕的監(jiān)聽器诗宣,不知道返回類型膘怕,用id代替,<ButtonDelegate>表示該協(xié)議是實(shí)現(xiàn)了ButtonDelegate
//還需要手動釋放內(nèi)存
@property (nonatomic,retain) id<ButtonDelegate> delegate;
-(void)onClick;
@end

創(chuàng)建一個(gè)listener實(shí)現(xiàn)這個(gè)協(xié)議:

//#import “Button.h”//不用導(dǎo)入,但在.m文件中需導(dǎo)入的protocol文件
@protocol ButtonDelegate;//作用同@class
@interface OnClickListener : NSObject <ButtonDelegate>
-(void)onClick;
@end

并在觸發(fā)時(shí)調(diào)用:

@implementation Button
-(void)onClick{
    //按鈕被點(diǎn)擊了召庞;
    //先判斷調(diào)用的對象是否實(shí)現(xiàn)了該方法
    if([_delegate respondsToSelector:@selector(onClick:)]){
        [_delegate onClick:self];
    }else{
        NSLog(@"未實(shí)現(xiàn)該方法");
    }
}

使用:

 //初始化一個(gè)按鈕
    Button *btn = [[[Button alloc] init] autorelease];
    //初始化一個(gè)按鈕監(jiān)聽器
    OnClickListener *listener = [[[OnClickListener alloc] init] autorelease];
    //將監(jiān)聽器添加到按鈕上
    btn.delegate  = listener;
    [btn onClick];

(原則誰觸發(fā)岛心,傳入誰)在使用協(xié)議下的方法下,一般傳入調(diào)用的對象篮灼;如當(dāng)某個(gè)按鈕點(diǎn)擊時(shí)忘古,一般傳入該按鈕;
— 同java,可單獨(dú)定義多個(gè)協(xié)議诅诱,且一個(gè)類也有實(shí)現(xiàn)多個(gè)協(xié)議:

定義protocol文件:
@protocol Study <NSObject>

@required //必須實(shí)現(xiàn)的方法,雖然是必須實(shí)現(xiàn)髓堪,但是編譯器不會出錯(cuò),OC是弱語法的娘荡,對類型要求不嚴(yán)格
-(void)testStudy;
//若不寫旦袋,默認(rèn)是@required
-(void)testStudy1;
@optional //可實(shí)現(xiàn)可不實(shí)現(xiàn)
-(void)testStudy2;
@end

一個(gè)類可同時(shí)實(shí)現(xiàn)多個(gè)protocol:

//同時(shí)實(shí)現(xiàn)兩個(gè)協(xié)議(相當(dāng)于java中實(shí)現(xiàn)兩個(gè)接口)
@protocol Study,Learn;

@interface Student : NSObject<Study,Learn>

在對象調(diào)用實(shí)現(xiàn)的協(xié)議方法時(shí),可先判斷是否實(shí)現(xiàn):

void testProtocol(){
    Student *stu =[[[Student alloc] init] autorelease];
    //判斷student是否遵守了Study協(xié)議
    if ([stu conformsToProtocol:@protocol(Study)]) {
        NSLog(@"student是遵守了Study協(xié)議");
    }
    //判斷student是否實(shí)現(xiàn)了某個(gè)方法它改;
    if([stu respondsToSelector:@selector(testStudy)]){
        NSLog(@"student 實(shí)現(xiàn)了testStudy方法");
        [stu testStudy];
    }else{
        NSLog(@"student沒有實(shí)現(xiàn)testStudy方法");
    }
}

+Block蘋果建議盡量多使用block,在多線程疤孕,異步任務(wù),集合遍歷央拖,集合排序祭阀,動畫轉(zhuǎn)場用的很多。[同java中的回調(diào)]鲜戒;
封裝了代碼专控,可以在任何時(shí)候調(diào)用執(zhí)行;(類型于java中直接在使用的時(shí)候new一個(gè)onClickListener)
Block可作為函數(shù)參數(shù)或函數(shù)的返回值遏餐;而其本身可帶輸入?yún)?shù)的返回值伦腐。它和傳統(tǒng)的函數(shù)指針很類似;但有區(qū)別:block是inline(內(nèi)聯(lián)函數(shù))失都,并默認(rèn)情況下對局部變量是只讀的柏蘑。(可定義在方法內(nèi)部和外部)
使用:

 //使用別名聲明一個(gè)帶兩個(gè)參數(shù)的block
typedef int(^MySum) (int,int);
void testBlock(){
    //第一種方式:直接定義;^是block的標(biāo)志,定義了一個(gè)block粹庞,接收兩個(gè)int類型的參數(shù)咳焚,并返回一個(gè)int類型;
    int (^Sum)(int,int) = ^(int a,int b){
        return a+b;
    };
    NSLog(@"sum is %i",Sum(10,11)) ;
    __block int c = 19;
    //第二種方式:使用聲明的block
    //可以訪問外部的成員庞溜,但不能修改(同java中接口中訪問外部變量用final)
    //若要訪問革半,外部的變量須用__block修飾
    MySum sum = ^(int a,int b){
        c = 20;
        NSLog(@"c is %i",c);
        return a+b;
    };
    NSLog(@"sum is %i",sum(10,31)) ;
}

實(shí)現(xiàn)按鈕監(jiān)聽:
在button.h中:

//定義一個(gè)block別名格式: 返回類型 (^名字)(參數(shù))
typedef void (^ButtonBlock)(Button *);
@property (nonatomic,assign) ButtonBlock listener;"
"在button.m中在onClick中方法中調(diào)用:
_listener(self);"
使用:
Button *btn = [[[Button alloc] init] autorelease];
    btn.listener = ^(Button *btn){
        NSLog(@"listener onclick %@",btn);
    };
    [btn onClick];

和指針函數(shù)的區(qū)別:

 int sumFound(int a,int b){
    return a+b;
}
void  testBlockAndPoint(){
    //定義了Sum這種block類型
    typedef int (^Sum)(int,int);
    //定義了sump這種指針類型
    typedef int  (*SumP)(int,int);
    //定義了一block變量
    Sum sum = ^(int a,int b){
        return a+b;
    };
    NSLog(@"block sum 和%i",sum(1,2));
    //指針函數(shù)指向?qū)崿F(xiàn)的方法
    SumP p = sumFound;
    NSLog(@"point sum %i",p(2,3));
}

+OC 相關(guān)基礎(chǔ)類
都位于Foundation(類似于java中的lang包,java中有基礎(chǔ)類都有對應(yīng)的類)

結(jié)構(gòu)體 +:位于Foundation/NSRange下

 typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;

這個(gè)結(jié)構(gòu)體表示事物的一個(gè)范圍,通常是字符串里的字符范圍或集合里的元素范圍又官;location(該范圍的起始位置)length(該范圍內(nèi)元素的個(gè)數(shù))延刘。
三種創(chuàng)建方式:
*逐個(gè)賦值;
*聚合賦值NSRange range={3,4};
*Foundation提供的一個(gè)快捷函數(shù):NSRange range = NSMakeRange(8, 10);

 //直接全部打印六敬,但不能直接使用rang,需使用NSString轉(zhuǎn)換
    NSLog(@"%@",NSStringFromRange(range));
    NSPoint p;
    p.x = 20;
    p.y = 37;
    NSLog(@"%@",NSStringFromPoint(p));

常用結(jié)構(gòu)體:NSSize,NSPoint,NSRange,NSRect;
(都有對應(yīng)的生成方法 NSMake(..) 碘赖;打印方法 NSStringFrom(.) ;繪制類生成方法 CG***Make(..)方法觉阅;)

+字符串
NSString:不可變(同java中的String)崖疤;
指向指針的指針秘车,將原變量的地址作參數(shù)傳入函數(shù)中典勇,可修改傳入的原變量的值;

 void testStringFromFile(){
    //從文件中讀取字符串
//    NSString *path =@"/Users/sionfan/work/ddd.txt";
    //另一種讀取文件的方式url
    NSURL *path = [NSURL URLWithString:@"file:///Users/sionfan/work/ddd.txt"];
    //定義一個(gè)錯(cuò)誤變量叮趴,傳入割笙,若有值,則有錯(cuò)誤信息眯亦;
    NSError *error;
    //指定字符串編碼UTF8;
    NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];//此處要對傳入的error賦值伤溉,則要把error的地址傳入才能對其賦值;(參數(shù)是指向指針的指針)
    if (error==nil) {
        //沒有錯(cuò)誤信息妻率,則文件讀取成功
        NSLog(@"讀取文件成功str:%@",str);
    }else{
        NSLog(@"讀取文件失斅夜恕:%@",error);
    }
    //也可以讀取網(wǎng)頁;
    NSURL *urlPath = [NSURL URLWithString:@"http://www.baidu.com"];
    NSError *httpError;
    //讀取URL
    NSString *str2 = [NSString stringWithContentsOfURL:urlPath encoding:NSUTF8StringEncoding error:&httpError];
    NSLog(@"讀取網(wǎng)頁成功str:%@",str2);
}
/**參數(shù)是指向指針的指針宫静,傳入str的地址&str走净,就可對傳入的原變量進(jìn)行修改;*/
void testModofyStr(NSString **str){
    *str = @"this is 修改后的str";
}
+(void)testString{
    //C中的字符串
    char *str = "this is a C string";
    //1.這種方式創(chuàng)建的方式不需要自己釋放內(nèi)存
    NSString *str1 = @"this is a OC string";
    //2.這種方式需要手動釋放內(nèi)存
    NSString *str2 = [[NSString alloc] init];
    str2 = @"this is a OC init string";
    //3.同上孤里,直接帶參數(shù)創(chuàng)建
    NSString *str3 = [[NSString alloc] initWithString:@"this is initwith Stirng"];
    //4.不帶@,將C的的字符串轉(zhuǎn)換成OC的字符串伏伯;
    NSString *str4 = [[NSString alloc] initWithUTF8String:"this is c string"];
    //5.帶格式符的字符串
    NSString *str5 = [[NSString alloc] initWithFormat:@"my age is %i,and height is %.2f",18,1.87];
    //上面對應(yīng)的方法都是自己創(chuàng)建的,需要手動釋放內(nèi)存捌袜;在NSString都有如下對應(yīng)的靜態(tài)方法说搅,可不用手動釋放內(nèi)存;
    //此處可能存在兩個(gè)錯(cuò)誤虏等,1.上面自己創(chuàng)建的對象未釋放弄唧,會內(nèi)存泄露;2霍衫,后面用靜態(tài)方法創(chuàng)建的對象自己已經(jīng)釋放套才,再手動釋放會造成野指針錯(cuò)誤
    str5 = [NSString stringWithString:@"this is static string"];
//    [str5 release];
    NSLog(@"%s\n,%@\n,%@\n,%@\n,%@\n,%@\n",str,str1,str2,str3,str4,str5);
    testStringFromFile();
    //傳入str的地址,可在執(zhí)行完函數(shù)后修改原變量的值
    testModofyStr(&str5);
    NSLog(@"%@",str5);
}

NSSting *str = @“345”;345沒有名字慕淡,只有一個(gè)指針str指向存儲了345字符串的這塊地址背伴;
+字符串導(dǎo)出+

 NSString *str = @"this is a export str";
    //若文件不存在,會自動創(chuàng)建
    //但若文件夾不存在,會自動報(bào)錯(cuò)
    NSString *path =@"/Users/sionfan/work1/ddda.txt";
    NSError *error;
    //atomically,原子性操作(先創(chuàng)建一個(gè)臨時(shí)文件傻寂,將文件一點(diǎn)點(diǎn)到這個(gè)臨時(shí)文件中息尺,再拷貝到目標(biāo)文件中);非原子性操作:直接向文件中寫入疾掰;(優(yōu)先考慮原子性操作搂誉,可考慮寫入安全)
    [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
    if (error) {
        //獲取本地重要錯(cuò)誤信息,類似于java的e.getMessage()
        NSLog(@"寫入失斁裁省:%@", [error localizedDescription]);
    }else{
        NSLog(@"寫入成功");
    }
}

+String相關(guān)方法

uppercaseString: 全部轉(zhuǎn)成大寫
lowercaseString:全部轉(zhuǎn)成小寫
capitalizedString:只是首字母轉(zhuǎn)成大寫
[@"abc" isEqualToString:@“Abc”]:比較兩個(gè)字符串內(nèi)容是否相同(相同返回1)
[@"abc" compare:@“Abc”]:比較字符串大刑堪谩;(返回一個(gè)枚舉值:三個(gè)值:NSOrderedAscending = -1L(右邊的大), NSOrderedSame(相同), NSOrderedDescending(左邊大))
[@"abc" caseInsensitiveCompare: @“Abc”]:忽略大小寫比較拂檩,返回值同上侮腹;
[str hasPrefix:@“stu”]:str是否以stu開頭;
[str hasSuffix:@“.jsp”]:str是否以.jsp結(jié)尾稻励;
[str rangeOfString:@“stu”]:查看stu在str的位置和長度父阻;返回一個(gè)NSRang的結(jié)構(gòu)體(用NSStringFromRang打印)望抽,未找到返回NSNotFound(NSIntegerMax)加矛;if(range==NSNotFound)未找到;
(同java煤篙,若有多個(gè)相同的字符斟览,則只返回第一個(gè)位);
[另帶同名方法辑奈,帶參數(shù):options(指定搜索選項(xiàng)苛茂,如搜索順序等):range :(指定一個(gè)范圍進(jìn)行搜索)]
[str substringFromIndex:2]:從index = 2開始截取末尾;
[str substringToIndex:2]:從開頭截取到index=2處身害;
[str substringWithRange:NSMakeRange(2, 4)]:從index=2開始截取4個(gè)字符味悄;
[str componentsSeparatedByString:@“.”]:以.分組(同java是split方法);返回NSArray;
[NSString pathWithComponents:paths]:將一個(gè)(NSMutableArray *paths)數(shù)組拼成一個(gè)路徑
[str pathComponents]:將一個(gè)路徑分解成一個(gè)數(shù)組塌鸯;
[path isAbsolutePath]:表示一個(gè)路徑是否是絕對路徑(實(shí)際上就是判斷開始位置有無/)
[path lastPathComponent]:返回一個(gè)路徑最后個(gè)目錄
[path stringByDeletingLastPathComponent]:返回刪掉最后一個(gè)目錄后的路徑侍瑟;
[path stringByAppendingPathComponent:@“work”]:在路徑最后拼接一個(gè)目錄,并返回拼接后的路徑
[path pathExtension]:返回一個(gè)文件路徑該文件的擴(kuò)展名(就是.后的內(nèi)容)丙猬;
[str stringByDeletingPathExtension]:刪掉擴(kuò)展名涨颜;
[str stringByAppendingPathExtension:@“html”]):拼接一個(gè)擴(kuò)展名(自動加.);
[str stringByAppendingFormat:@“%i”,2]):拼接一個(gè)帶格式符的字符串
[str intValue]:將內(nèi)容是int類型的string轉(zhuǎn)成int(同java中String.valueOf),另外double,float都有對應(yīng)的方法茧球;
[str length]:返回字符串的字符個(gè)數(shù)
[str characterAtIndex: 6]:返回index=6處的字符
[str UTF8String]:將一個(gè)OC的字符串轉(zhuǎn)成一個(gè)C的字符串庭瑰;

+**NSMutableString **+可變長字符串(同java中StringBuilder),是NSString的子類抢埋,其父類的方法都可用弹灭;
[一般對象中帶有 Mutable ,就表示是一個(gè)可變的對象]

 //長度可變督暂,可先在初始化時(shí)指定容量大小,就會預(yù)先分配10個(gè)字?jǐn)?shù)的存儲空間穷吮,效率高一些逻翁;
    NSMutableString *ms = [[NSMutableString alloc] initWithCapacity:10];
    //設(shè)置字符串內(nèi)容
    [ms setString:@"1234"];
    //直接拼接
    [ms appendString:@"567"];
    //拼接帶占位符的字符串
    [ms appendFormat:@"age is %i",23];
    //替換指定位置和長度的字符串,一般與rangeOfString全用進(jìn)行文本替換
    [ms replaceCharactersInRange:NSMakeRange(2, 2) withString:@"eed"];
    //在index=3的位置插入指定的字符串
    [ms insertString:@"insert" atIndex:3];
    //刪除指定位置和長度的字符串
    [ms deleteCharactersInRange:NSMakeRange(3, 2)];
    NSLog(@"%@",ms);
//    [ms release];

博客地址:IOS學(xué)習(xí)筆記之Object-C(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捡鱼,一起剝皮案震驚了整個(gè)濱河市八回,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驾诈,老刑警劉巖缠诅,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乍迄,居然都是意外死亡管引,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門就乓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汉匙,“玉大人拱烁,你說我怎么就攤上這事生蚁。” “怎么了戏自?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵邦投,是天一觀的道長。 經(jīng)常有香客問我擅笔,道長志衣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任猛们,我火速辦了婚禮念脯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弯淘。我一直安慰自己绿店,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布庐橙。 她就那樣靜靜地躺著假勿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪态鳖。 梳的紋絲不亂的頭發(fā)上转培,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音浆竭,去河邊找鬼浸须。 笑死惨寿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的删窒。 我是一名探鬼主播缤沦,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼易稠!你這毒婦竟也來了缸废?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤驶社,失蹤者是張志新(化名)和其女友劉穎企量,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亡电,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡届巩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了份乒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恕汇。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖或辖,靈堂內(nèi)的尸體忽然破棺而出瘾英,到底是詐尸還是另有隱情,我是刑警寧澤颂暇,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布缺谴,位于F島的核電站,受9級特大地震影響耳鸯,放射性物質(zhì)發(fā)生泄漏湿蛔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一县爬、第九天 我趴在偏房一處隱蔽的房頂上張望阳啥。 院中可真熱鬧,春花似錦财喳、人聲如沸察迟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卷拘。三九已至,卻和暖如春祝高,著一層夾襖步出監(jiān)牢的瞬間栗弟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工工闺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乍赫,地道東北人瓣蛀。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像雷厂,于是被迫代替她去往敵國和親惋增。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法改鲫,類相關(guān)的語法诈皿,內(nèi)部類的語法,繼承相關(guān)的語法像棘,異常的語法稽亏,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評論 0 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)缕题,斷路器截歉,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 從14年開始,每年的元月烟零,都會重讀兩本書瘪松,《中國哲學(xué)簡史》是其一。今年因?yàn)橐辉路轃o暇分身锨阿,就拖到了二月宵睦。今年是第四...
    柳二白閱讀 452評論 0 0
  • 你說愛應(yīng)該簡單,不該復(fù)雜化群井; 就像羅伯特·伯恩斯的浪漫詩一樣状飞。 你說愛毋須表達(dá)毫胜,說白了沒意思书斜; 就像威廉·布雷克《...
    零時(shí)零分零秒閱讀 224評論 0 0