Objective-C(簡稱OC)

powerx_yc發表於2016-11-11

OC基礎知識:

OC繼承了C語言的所有特點。

  • @ 表示C語言沒有 OC所增加的
  • 每次拿記憶體之後,要檢視是否申請到記憶體,記憶體用完之後一定要手動去釋放,避免出現野指標。
if (strcmp(str3, "Good") == 0){
//                printf("相同\n");
//                
//            }else{
//                printf("不同\n");
//            }
//            //將str3賦值為NULL避免產生野指標,同時也避免重複釋放
//            if (str3 != NULL) {
//                free(str3);
//                str3 = NULL;
//            }
  • NSLog 代表日曆性。 OC語言命名前面加倆個字母的字首,防止重複命名.Swift可在不同檔案同命名。
    //Objective-C的字串
//        NSString *str4 = @"hello, world!";
//        
//        NSLog(@"%@",str4);
//        
//        NSLog(@"Hello, World!");
  • OC中#if 0 和 #endif 表示中間的程式碼為註釋掉,不參加編譯.和Swift中的 ** */ 意思大致相同
 #if 0 

#endif
  • C語言中Int為32位 但是現在手機都是64位,所以加NSInteger
  • 加下劃線表示為私有的,不能亂動。例如:
@interface YFStudent : NSObject{
    
    NSString *_name;
    NSInteger _age;
    }
  • 在OC中建立方法和Swift不一樣,Swift中新增類是Static 或者 class ,但是OC中:類的定義是 -(void) eat; OC的圓括號裡面為型別。OC中的布林值為大寫的BOOL,例如: -(BOOL) study:(NSString *) courseName

OC方法的名字有獨特之處;比如

方法名字: study:   forHours:
- (BOOL) study:(NSString *) courseName forHours: (NSUInteger) hour;
  • OC和Swift一樣,建立物件也需要初始化方法,在OC中初始化方法為輸入init,OC會自動新增 - (instancetype)init,這樣的話就可以在Init後面繼續新增:比如:
申明部分:
- (instancetype)initWithName:(NSString *) name age:(NSInteger) age;
實現部分:

在OC實現部分不用去賦值貼上,在類的實現方法部分輸入Init 自動會新增需要實現的部分程式碼:

//類的實現部分
@implementation YFStudent

-(instancetype)initWithName: (NSString *)name
                        age:(NSInteger)age{
    if (self = [super init]) {
        _name = name;
        _age = age;
        
    }
    return self;
    
}
  • OC中給物件發訊息和Swift中有所不同,OC中為[a foo] ,為給物件發訊息,Swift中為[0.foo].

  • typedef long NSInteger;有自適應性,在32位和64位中都可以進行切換.

  • NSUInteger代表無負數

  • OC和C語言一樣先寫型別在寫變數,OC的方括號是寫右邊自動補左邊,Swift是寫左邊自動補右邊.OC中 alloc代表著請示記憶體.

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        YFStudent *stu = [[YFStudent alloc] initWithName:@"王大錘" age:25];

這代表請求 給學生記憶體.

  • setName是修改學生的名字.

  • 減號和屬性相關。+號和屬性無關

  • 代表手動擴充套件(屬性合成)

- @synthesize <#property#>
  • //如果不希望自動合成屬性
@dynamic <#property#>
  • 匯入自己的為雙引號 "",匯入系統的為尖括號<>

類方法

  • 1、物件方法(1) 減號 - 開頭(2)只能由物件來呼叫(3)物件方法中能訪問當前物件的成員變數(例項變數)
    2、類方法(1) 加號 + 開頭(2) 只能由類(名)來呼叫(3) 類方法中不能訪問成員變數(例項變數)
    3、類方法的好處和使用場合(1) 不依賴於物件,執行效率高(2) 能用類方法,儘量用類方法(3) 場合:當方法內部不需要使用到成員變數時,就可以改為類方法

self

self 是一個指標,用在方法中時,哪個物件呼叫該方法 self 指標就指向哪個物件,可以把它當作呼叫該方法的那個物件的指標一樣使用。

#import <Foundation/Foundation.h>/*

self 的用途:
(1) 誰呼叫了當前方法,self 就代表誰* self 出現在物件方法中,self 就代表物件* self 出現在類方法中,self 就代表類
(2) 在物件方法利用"self->成員變數名"訪問當前物件內部的成員變數
(3) [self 方法名]可以呼叫其他物件方法\類方法

繼承

#import <Foundation/Foundation.h>

1、繼承的好處:
(1) 抽取重複程式碼
(2) 建立了類之間的關係
(3) 子類可以擁有父類中的所有成員變數和方法
2、注意點(1) 基本上所有類的根類是 NSObject

多型

多型就是用父類型別的指標建立子類的物件,比如 Dog 類繼承了 Animal 類,下面都是多型:

Animal *aa = [Dog new];
Dog *dd = (Dog *)aa;

1.沒有繼承就沒有多型
2.程式碼的體現:父類型別的指標指向子類物件
3.好處:如果函式\方法引數中使用的是父類型別,可以傳入父類、子類物件
4.侷限性:父類型別的變數不能直接呼叫子類特有的方法。必須強轉為子類型別變數後,才能直接呼叫子類特有的方法

相關文章