OC思想與基礎(chǔ)語法

OC簡介

  • C語言的基礎(chǔ)上,Objective - C增加了一層最小的面向?qū)ο笳Z法

  • 完全兼容C語言

  • 可以在OC代碼中混入C語言,甚至是C++代碼

  • 可以使用OC開發(fā)Mac OS X平臺(tái)和iOS平臺(tái)的應(yīng)用

  • OC是面向?qū)ο蟮模?code>C是面向過程的,只是解決問題的不同思想

  • 面向?qū)ο螅P(guān)注解決問題需要哪些東西)如,打電話找手機(jī)

  • 面向過程(關(guān)注解決問題需要哪些步驟)如,打開手機(jī),按號(hào)碼,撥打

  • 面向?qū)ο蠓庋b的好處

    • 更接近人類的思考方式
    • 只需要關(guān)注對(duì)象,不需要關(guān)注步驟

OC語法概括

  • 基本所有關(guān)鍵字都是以@開頭
    @interface、@implementation、@end、@public、@protected
    @private、@selector、@try、@catch、@throw、@protocol
    @optional、@required、@class、@property、@synthesize
    
    self、super、id、__cmd、__block、__strong、__weak
    
  • 字符串以@開頭
    比如@"Hello"OC中的字符串,而"Hello"則是C語言中的字符串
  • 其他語法
基本數(shù)據(jù)類型 int、char、float、double、BOOL(YES\NO)[本質(zhì)是char]
nil 相當(dāng)于C語言中的NULL,也就是 0
基本語句 循環(huán)語句do while 、while 、for、條件語句if、if-else、switch
注釋 //單行注釋、/*...*/多行注釋
屏幕輸出 NSLog(@"Hello");NSLog(@"age is %i",24);會(huì)自動(dòng)換行

OC程序的開發(fā)過程

.m源文件-> 編譯 ->.o目標(biāo)文件-> 鏈接 ->a.out可執(zhí)行文件

OC基礎(chǔ)知識(shí)

  • #import的用途

    • #include一樣,拷貝文件的內(nèi)容
    • 可以自動(dòng)防止文件的內(nèi)容被重復(fù)拷貝
  • 類和對(duì)象的關(guān)系

    • OC中的類相當(dāng)于造東西的圖紙,用來描述一類事物,也就是說,要想創(chuàng)建對(duì)象,必須先有類
    • 利用來創(chuàng)建對(duì)象,對(duì)象的具體存在
    • 面向?qū)ο蠼鉀Q問題應(yīng)該是,先考慮需要設(shè)計(jì)哪些,再利用類創(chuàng)建多少個(gè)對(duì)象
    • 每個(gè) "對(duì)象" 內(nèi)部默認(rèn)有個(gè) "isa 指針" 指向它的類
    • 所有 "對(duì)象" 共用一份方法
    • 每個(gè)類中有個(gè)“superclass 指針”指向它的父類
  • 需要設(shè)計(jì)哪些,如何設(shè)計(jì)

    • 的設(shè)計(jì),只關(guān)心3樣?xùn)|西

      • 類名(事物名稱):人(VampireJune)
        • 第一個(gè)字母必須是大寫
        • 不能有下劃線
        • 多個(gè)英文單詞用駝峰標(biāo)識(shí)
      • 屬性(配置) :身高(height)、年齡(age)
      • 行為(功能):跑(run)、吃(eat)
    • 一般名詞都是

    • 擁有相同(或類似)屬性和行為的對(duì)象都可以抽出一個(gè)

  • 完整地寫一個(gè)聲明實(shí)現(xiàn)

    // 引入 "Foundation" 框架,因?yàn)槭褂昧?"NSObject"
    #import <Foundation/Foundation.h>
    
    1. 類的聲明:聲明對(duì)象的屬性和行為
    @interface VampireJune : NSObject 
      // 關(guān)鍵字 "@interface" 和 類名 "VampireJune" 之間必須有一個(gè)空格
      // NSObject  目的是:讓 "VampireJune" 這個(gè)類具備創(chuàng)建對(duì)象的能力
      // ":" :類名 "VampireJune" 和 "NSObject" 之間的冒號(hào)是繼承語法
    {// 大括號(hào)里 "只能" 用來聲明 "對(duì)象屬性"( 實(shí)例變量\成員變量)默認(rèn)會(huì)初始化為0
    
      // @public 可以讓外部的指針間接訪問對(duì)象內(nèi)部的成員變量
      @public //  "屬性" (成員變量)默認(rèn)是被保護(hù)的,不允許指針直接訪問
      int age; // 年齡,屬性命名完,寫一個(gè) ";" 英文分號(hào),告訴這個(gè)屬性結(jié)束了
      double weight; // 體重
    } // 大括號(hào)里 "只能" 用來聲明 "對(duì)象屬性",必須要有 大括號(hào)
    
    // 方法(行為): 方法名、參數(shù)、返回值
    // 聲明:在 "@interface @end" 中聲明,不能放到大括號(hào)內(nèi)
    // 實(shí)現(xiàn):在 "@implementation @end" 中實(shí)現(xiàn)
    - (void) run;
    // 只要是OC對(duì)象的方法,必須以減號(hào) "-" 開頭
    // OC方法中任何數(shù)據(jù)類型都必須用小括號(hào) "()" 括住
    // OC方法中的小括號(hào) "()" :括住數(shù)據(jù)類型 
    @end  // 表示類聲明完畢
    
    2. 類的實(shí)現(xiàn)
    // 用來實(shí)現(xiàn) "@interface @end" 中聲明的方法
    @implementation VampireJune
    // 方法的實(shí)現(xiàn)(說清楚方法里面有什么代碼)
    - (void) run
    {
      // 訪問自己對(duì)象內(nèi)部的屬性,直接寫屬性名
      NSLog(@"%d歲、%f公斤的人跑起來了",age,weight);
      * "對(duì)象" 調(diào)用某個(gè)方法,會(huì)跟隨 "isa 指針" 找到對(duì)應(yīng)的類,在類里面找一找有沒有這個(gè)方法
      * 一旦發(fā)現(xiàn)有,就調(diào)用這個(gè)方法,來到方法對(duì)應(yīng)的代碼,訪問當(dāng)前對(duì)象的成員變量
    }
    
    @end
    
    int main()
    {
      // 在OC中,想執(zhí)行一些行為,就寫上一個(gè)中括號(hào) [行為執(zhí)行者 行為名稱];
      // 利用類來創(chuàng)建對(duì)象
      // 執(zhí)行了 "VampireJune" 這個(gè)類的 "new" 行為來創(chuàng)建新對(duì)象
      //  [VampireJune new] 會(huì)創(chuàng)建出一個(gè)新對(duì)象,并返回新對(duì)象本身(新對(duì)象地址)
    
      // OC中想修改操縱對(duì)象,只能用指針
      // 定義了一個(gè)指針變量 "v",將來指向 "VampireJune" 類型的對(duì)象
      VampireJune *v = [VampireJune new];
    
      // 給 "v" 所指向的對(duì)象的 "age" 屬性賦值 
      v->age = 23;
      v->weight= 60.0;
      NSLog(@" age is %d,weight is %f",v->age,v->height);
    
      // 給 "v" 所指向?qū)ο?發(fā)送一條 "run" 消息(OC的消息機(jī)制)
      // 就會(huì)調(diào)用 這個(gè)對(duì)象的 "run" 方法,就會(huì)去對(duì)象的實(shí)現(xiàn)里面找這個(gè)方法
      // 一旦找到這個(gè)方法,就會(huì)執(zhí)行這個(gè)方法里面的代碼
      [v run]; 
      return 0;
    }
    
    
  • @implementation

    • 沒有@interface,只有@implementation,也能成功定義一個(gè)類
    • @implementation中不能聲明和@interface一樣的成員變量
@implementation Car : NSObject
{
  @public
  int wheels; // 輪子
  int speed; // 速度
}

- (void)run
{
  NSLog(@"%d個(gè)輪子,%dkm/h的車跑起來了",wheels,speed);
}
@end
  • 對(duì)象函數(shù)參數(shù)
    • 對(duì)象成員變量作為函數(shù)參數(shù)
    • 指向?qū)ο蟮闹羔樧鳛楹瘮?shù)參數(shù)
      • 修改指向?qū)ο蟮某蓡T
      • 修改指針的指向

常見錯(cuò)誤

  • 只有類的聲明,沒有類的實(shí)現(xiàn)
  • 漏了@end
  • @interface@implementation嵌套
  • 兩個(gè)類的聲明嵌套
  • 成員變量沒有寫在括號(hào)里面
  • 方法的聲明寫在了大括號(hào)里面

語法細(xì)節(jié)

  • 方法不能當(dāng)做函數(shù)一樣調(diào)用
  • 成員變量不能在{}中進(jìn)行初始化、不能被直接拿去訪問
  • 類的實(shí)現(xiàn)可以寫在main函數(shù)的后面,一定寫在類的聲明后面就可以

對(duì)象方法和函數(shù)的區(qū)別

  • 對(duì)象方法

    • 對(duì)象方法都是以減號(hào)-開頭
    • 對(duì)象方法必須聲明在 "@interface @end" 之間,必須實(shí)現(xiàn)在 "@implementation @end"之間,對(duì)象方法不能獨(dú)立與類存在
    • 對(duì)象方法只能由對(duì)象調(diào)用
    • 對(duì)象方法類\對(duì)象所有
    • 對(duì)象方法中能訪問當(dāng)前對(duì)象的成員變量(實(shí)例變量)
  • 函數(shù)

    • 函數(shù)不屬于類,跟類沒有關(guān)系,只歸定義函數(shù)的文件所有
    • 函數(shù)能寫在文件中的任意位置("@interface @end"之間)
    • 函數(shù)內(nèi)部不能直接通過成員變量名訪問某個(gè)對(duì)象的成員變量

對(duì)象方法的聲明規(guī)范

  • 方法首字母小寫
  • 從第二個(gè)單詞開始,首字母大寫
  • 盡量寫的像句子一樣,可讀性好
  • 形參首字母小寫,超過一個(gè)單詞,其他首字母大寫
  • 形參與形參之間,一定要有一個(gè)空格
  • 一個(gè)形參對(duì)應(yīng)一個(gè)冒號(hào),冒號(hào)也是方法名的一部分
  • 返回值永遠(yuǎn)只有一個(gè)
  • 類方法聲明規(guī)范上面全部適用,只是減號(hào)-變?yōu)榧犹?hào)+
  • 同一個(gè)類中不允許有兩個(gè)對(duì)象方法同名
// 1. 無返回值
// 1.1 無形參
-  (void)pi; // 方法名 :-pi
// 1.2 有形參
-  (void)squareWithNum:(int)num; // 方法名 :-squareWithNum: 

// 2. 有返回值
// 2.1 無形參
-  (int)pi; // 方法名 :-pi
// 2.2 有形參
-  (int)sumWithNum1:(int)num1 andNum2:(int)num2; 
// 方法名 :-sumWithNum1: andNum2:

對(duì)象方法圖例

//  無形參 有返回值
-  (double)pi; // 方法名 :-pi

// 方法調(diào)用
[c pi];
方法解析1.jpg
方法調(diào)用1.jpg
//  有1個(gè)形參 有返回值
-  (double)square:(double)number; // 方法名 :-square: 

// 方法調(diào)用
[c square: 10];
方法解析2.jpg
方法調(diào)用2.jpg
//  有多個(gè)形參 有返回值
-  (double)sumOfNum1:(double)num1 andNum2(double)num2; 
// 方法名 :-sumOfNum1: andNum2:

// 方法調(diào)用
[c sumOfNum1: 10 andNum2: 21];
方法解析3.jpg
方法調(diào)用3.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,621評(píng)論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,194評(píng)論 8 265
  • 最近開始每天用文字記錄點(diǎn)事,空閑看點(diǎn)書,另外還有每天的帶娃和家務(wù),我發(fā)現(xiàn)我的時(shí)間竟然不夠用,而時(shí)間都去哪里了呢? ...
    竹安倩閱讀 440評(píng)論 0 0
  • 1----數(shù)組---- 1:數(shù)組簡介 2:不可變數(shù)組方法 //1.數(shù)組的創(chuàng)建 //2.遍歷數(shù)組 //3.通過元素內(nèi)...
    前進(jìn)的蘇辰閱讀 2,110評(píng)論 0 1
  • 說到國家形象的樹立和傳播,人們最容易想到的是當(dāng)今無處不在的大眾傳播,的確,當(dāng)今世界各國的國家形象主要是由大眾傳播媒...
    SpencerWu閱讀 563評(píng)論 0 1

友情鏈接更多精彩內(nèi)容