objective-C概念總結(jié)

面向?qū)ο缶幊蹋╫op)

  • 基本概念

    • 對(duì)象:對(duì)象是消息的接收者
    • 類(lèi):類(lèi)是對(duì)象的藍(lán)圖和模板
    • 消息:對(duì)象之間通信的手段
  • 四大支柱

    • 抽象:創(chuàng)建類(lèi)的過(guò)程就是一個(gè)抽象的過(guò)程,需要進(jìn)行數(shù)據(jù)抽象(找到和對(duì)象相關(guān)的屬性)和行為抽象(找到和對(duì)象相關(guān)的方法)遭京。
    • 封裝:隱藏一切可以隱藏的實(shí)現(xiàn)細(xì)節(jié)(累的成員變量、方法的具體實(shí)現(xiàn))癞埠,向外界(調(diào)用者)提供最簡(jiǎn)單的編程接口(方法)。
    • 繼承:從已經(jīng)有的類(lèi)創(chuàng)建新類(lèi)的過(guò)程雹仿。提供繼承信息的類(lèi)稱(chēng)之為父類(lèi)(超類(lèi)勺像、基類(lèi)),得到繼承信息的類(lèi)稱(chēng)之為子類(lèi)(派生類(lèi)凫乖、衍生類(lèi))确垫。
    • 多態(tài):同樣的消息不同的執(zhí)行方式(不看指針看對(duì)象,相同類(lèi)型的指針指向不同子類(lèi)型的對(duì)象執(zhí)行相同的消息表現(xiàn)出不同的行為)帽芽。
  • 三個(gè)步驟

    • 定義類(lèi)
    • 創(chuàng)建對(duì)象
    • 發(fā)消息

定義類(lèi):
類(lèi)的聲明部分:

@interface 類(lèi)名 : 父類(lèi)名 {
    //成員變量(數(shù)據(jù)抽象)
}
// 屬性(數(shù)據(jù)抽象)
// 初始化方法
// 方法(行為抽象)
@end

類(lèi)的實(shí)現(xiàn)部分:

@implementation 類(lèi)名
// 方法的實(shí)現(xiàn)

創(chuàng)建對(duì)象:

類(lèi)名 *對(duì)象指針 = [[類(lèi)名 alloc] 初始化方法];

發(fā)消息:

[對(duì)象指針 方法名];
返回可I型 變量名 = [對(duì)象指針 方法標(biāo)簽:參數(shù)];
[對(duì)象指針 方法標(biāo)簽1:參數(shù)1 標(biāo)簽2:參數(shù)2];

例子:

#import <Foundation/Foundation.h>

// Step 1. 定義類(lèi)
// 數(shù)據(jù)抽象: 找到和類(lèi)(對(duì)象)相關(guān)的屬性(找名詞)
// 行為抽象: 找到和類(lèi)(對(duì)象)相關(guān)的方法(找動(dòng)詞)

// 類(lèi)的聲明部分
@interface Circle : NSObject {
    // 數(shù)據(jù)抽象
    @private double _radius;
}


// 類(lèi)方法  +號(hào) 通過(guò)類(lèi)名直接調(diào)用(給類(lèi)發(fā)消息)
// 對(duì)象方法 -號(hào) 必須先創(chuàng)建對(duì)象才能調(diào)用(給對(duì)象發(fā)消息)

+ (instancetype) circleWithRadius:(double) radius;

// 初始化方法
//- (instancetype) initWithRadius:(double) radius;

// 行為抽象

- (double) perimeter;

- (double) area;

@end

// 類(lèi)的實(shí)現(xiàn)部分
@implementation Circle

// 在類(lèi)方法中self代表類(lèi)
+ (instancetype)circleWithRadius:(double)radius {
    return [[self alloc] initWithRadius:radius];
}

// 在對(duì)象方法中self代表對(duì)象
- (instancetype) initWithRadius:(double) radius {
    if (self = [super init]) {
        _radius = radius;
    }
    return self;
}

- (double) perimeter {
    return 2 * M_PI * _radius;
}

- (double) area {
    return M_PI * _radius * _radius;
}

@end

static const double WALL = 5.5;
static const double AISLE = 7.8;

int main() {
    // 自動(dòng)釋放池(離開(kāi)釋放池申請(qǐng)的內(nèi)存會(huì)做一次釋放操作)
    @autoreleasepool {
        printf("請(qǐng)輸入游泳池的半徑: ");
        double r;
        scanf("%lf", &r);
        // Step.2 創(chuàng)建對(duì)象
        // 用中綴符語(yǔ)法給對(duì)象發(fā)消息
        Circle *smallCircle = [Circle circleWithRadius:r];
        Circle *bigCircle = [Circle circleWithRadius:r + 3];
        // Step.3 給對(duì)象發(fā)消息求解問(wèn)題
        printf("The price of aisle is $%.2f\n",
               ([bigCircle area] - [smallCircle area]) * AISLE);
        printf("The price of wall is $%.2f\n", [bigCircle perimeter] * WALL);
    }
    return 0;
}

系統(tǒng)常用類(lèi)

  • 字符串的使用(NSString/NSMutableString)

    • 創(chuàng)建字符串
      • +string
      • +stringWithFormat:
      • +stringWithUTF8String:
      • +stringWithContentsOfFile:
      • +stringWithContenstOfURL:
    • 常用方法和屬性
      • length 獲得字符串長(zhǎng)度
      • -characterAtIndex: 取指定位置的字符
      • UTF8String 將字符串轉(zhuǎn)成UTF編碼的字符串
      • -stringByAppendingString: 追加字符串
      • -stringByAppendingFormat: 追加帶樣式的字符串
      • -componentsSeparatedByString: 拆分字符串
      • -substringFromIndex: 從指定位置取子串
      • -substringToIndex: 取到指定位置的子串
      • -substringWithRange: 取指定位置和長(zhǎng)度的子串
      • -containsString: 判斷有沒(méi)有包含另一個(gè)字符串
      • -rangeOfString: 查找另一個(gè)字符串出現(xiàn)的位置
      • -stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement: 用指定字符串替換某些字符串
      • -compare: 比較兩個(gè)字符串
      • -isEqualToString: 判斷兩個(gè)字符串內(nèi)容是否相同
      • -hasPrefix: 判斷字符串是否以指定的字符串開(kāi)頭
      • -hasSuffix: 判斷字符串是否以指定的字符串結(jié)尾
      • -uppercaseString: 獲得大寫(xiě)字符串
      • -lowercaseString: 獲得小寫(xiě)字符串
      • -capitalizedString: 獲得首字母大寫(xiě)字符串
    • NSMutableString 特有的:
      • -appendFormat: 追加字符串
      • -appendString: 追加帶格式的字符串删掀。
      • -insertString: atIndex: 在指定位置插入字符串
      • -replaceCharactersInRange: withString: 用指定的字符串替換指定范圍的字符串
  • 數(shù)組(NSArray/NSMutableArray)
    // 數(shù)組里面只能放對(duì)象指針,不能放基本數(shù)據(jù)類(lèi)型
    // 頻繁的修改數(shù)組元素建議使用NSMutableArray

    • containsObject: 判斷數(shù)組中有沒(méi)有指定對(duì)象
    • count 數(shù)組元素的個(gè)數(shù)
    • firstObject 取數(shù)組中第一個(gè)元素
    • lastObject 取數(shù)組中最后一個(gè)元素
    • indexOfObject: 在數(shù)組中查找指定的對(duì)象返回位置(下標(biāo))或者(NSNotFound)
    • sortedArrayUsingDescriptor: 用指定的排序描述符創(chuàng)建一個(gè)元素有序的數(shù)組

    NSMutableArray 特有的方法:

    • addObject: 向數(shù)組中添加元素
    • addObjectsFromArray: 批量添加元素
    • insertObject:atIndex: 在指定位置插入元素
    • removeAllObjects:刪除所有元素
    • removeLastObject:刪除最后一個(gè)元素
    • removeObject:刪除指定的元素
    • removeObjectAtIndex:刪除指定位置的元素
    • sortUsingDescriptor:用指定的描述對(duì)數(shù)組進(jìn)行排序
  • 字典(NSDictionary/NSMutableDictionary)

    • count 鍵值對(duì)組合的數(shù)量
    • allkeys 獲得所有的鍵
    • allValues 獲得所有的值
    • -objectForKey: 查找指定鍵的值
      NSMutableDictionary的方法
    • -serObject:forKey: 添加新的鍵值對(duì)組合
    • -removeObjectForObject: 根據(jù)指定的鍵刪除鍵值對(duì)組合
    • -removeAllObjects: 刪除所有的鍵值對(duì)組合

類(lèi)別(Category)

 給已有的類(lèi)打一個(gè)補(bǔ)丁包嚣镜,增強(qiáng)它的功能爬迟。
 一個(gè)類(lèi)方法比屬性更重要。
#import <Foundation/Foundation.h>

@interface NSString (Util)

- (instancetype) reverse;

- (instancetype) encodeWithKey:(NSInteger) key;

- (instancetype) decodeWithKey:(NSInteger) key;

@end

#import "NSString+Util.h"

@implementation NSString (Util)

- (instancetype) reverse {
    NSMutableString *mStr = [NSMutableString string];
    for (NSInteger i =  self.length - 1; i >= 0; i--){
        unichar ch = [self characterAtIndex:i];
        [mStr appendFormat:@"%C", ch];
    }
    return [mStr copy];
}

- (instancetype) encodeWithKey:(NSInteger) key {
    NSMutableString *mStr = [NSMutableString string];
    for(int i = 0; i < self.length; i++){
        unichar ch = [self characterAtIndex:i];
        ch = ch ^ key;
        [mStr appendFormat:@"%C", ch];
    }
    return [mStr copy];
}

- (instancetype) decodeWithKey:(NSInteger) key {
    return [self encodeWithKey:key];
}
@end

#import <Foundation/Foundation.h>
#import "NSString+Util.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *str = @"我恨你中國(guó)";
        NSLog(@"%@", [str reverse]);
        NSString *encodedStr = [str encodeWithKey:100];
        NSLog(@"%@", encodedStr);
        NSLog(@"%@", [encodedStr decodeWithKey:100]);
    }
    return 0;
}

![屏幕快照 2016-03-23 20.52.31.png](http://upload-images.jianshu.io/upload_images/1787713-b6132b4f2c60a787.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

提示:在Category定義的方法命名時(shí)菊匿,最好加上命名前綴,例如命名類(lèi)的前綴時(shí)ZP计福,那么Category中的方法應(yīng)加上zp_前綴跌捆,這樣做主要是為了讓調(diào)用者能夠區(qū)分是蘋(píng)果原生的方法還是Category新加的方法。

屬性(Property)

//一個(gè)頂三個(gè)

@property (屬性修飾符) 類(lèi)型 變量名象颖;

在默認(rèn)的情況下佩厚,屬性會(huì)自動(dòng)合成成員變量以及setter(修改器)、getter(訪問(wèn)器)方法说订,如果不愿意使用自動(dòng)合成抄瓦,也可以在類(lèi)的實(shí)現(xiàn)部分(.m)通過(guò)@synthesize指令指定屬性如何合成。

說(shuō)明:如果需要向外部暴露對(duì)象的某個(gè)屬性就是用@property陶冷,這樣可以通過(guò)點(diǎn)語(yǔ)法來(lái)操作這個(gè)屬性钙姊;如果不想暴露對(duì)象的某個(gè)屬性(將數(shù)據(jù)保護(hù)起來(lái))就應(yīng)該直接定義成員變量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末埂伦,一起剝皮案震驚了整個(gè)濱河市煞额,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沾谜,老刑警劉巖膊毁,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異基跑,居然都是意外死亡婚温,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)媳否,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栅螟,“玉大人栈顷,你說(shuō)我怎么就攤上這事∏断铮” “怎么了萄凤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)搪哪。 經(jīng)常有香客問(wèn)我靡努,道長(zhǎng),這世上最難降的妖魔是什么晓折? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任惑朦,我火速辦了婚禮,結(jié)果婚禮上漓概,老公的妹妹穿的比我還像新娘漾月。我一直安慰自己,他們只是感情好胃珍,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布梁肿。 她就那樣靜靜地躺著,像睡著了一般觅彰。 火紅的嫁衣襯著肌膚如雪吩蔑。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天填抬,我揣著相機(jī)與錄音烛芬,去河邊找鬼。 笑死飒责,一個(gè)胖子當(dāng)著我的面吹牛赘娄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宏蛉,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼遣臼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了檐晕?” 一聲冷哼從身側(cè)響起暑诸,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辟灰,沒(méi)想到半個(gè)月后个榕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芥喇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年西采,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片继控。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡械馆,死狀恐怖胖眷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霹崎,我是刑警寧澤珊搀,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站尾菇,受9級(jí)特大地震影響境析,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜派诬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一劳淆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧默赂,春花似錦沛鸵、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至耀里,卻和暖如春蜈缤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冯挎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咙鞍,地道東北人房官。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像续滋,于是被迫代替她去往敵國(guó)和親翰守。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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