日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

id、构造方法、Category 分类、类的本质、description方法、SEL

發布時間:2025/3/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 id、构造方法、Category 分类、类的本质、description方法、SEL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

1.id: 萬能指針id :id對象不能用點語法、id對象本身已經有 * 了 因此變量名不能有 * 。
  可以吧id理解為 NSObject * 類型數據!

  int main()
    {
      @autoreleasepool {
        Person *p = [Person new];
        NSObject *o = [Person new];
        // 萬能指針id
        id d = [Person new];
        [d setAge:10];
        [d setObj:@"123456"];
        NSLog(@"%d",[d age]);
    }
    return 0;
  }

?

2.構造方法:用于調用構造方法的同時初始化部分數據

  //Person.m :
  #import "Person.h"
  @implementation Person
  // 重寫init方法
  - (id)init
  {
    if(self = [super init])
    {
      _age = 10;
    }
    return self;
  }
  @end

?

3.自定義構造方法:同時初始化更多數據

  //Person.m
  - (id)initWithName:(NSString *)name andAge:(int)age
  {
    if(self = [super init])
    {
      _name = name;
      _age = age;
    }
    return self;
  }

  //Student.m
  - (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
  {
    if(self = [super initWithName:name andAge:age])
    {
      _no = no;
    }
    return self;
  }

?

4.Category-分類:在不改變原Person類的基礎上給Person類擴展一些方法,主要用于給系統類擴展方法。

?

5.分類的應用:給系統類NSString類擴展一個方法

  //NSString+Number.m
  #import "NSString+Number.h"

  @implementation NSString (Number)
  // 分類的作用:可以擴展原類的功能。
  + (int)numberCountOfString:(NSString *)str
  {
    return str.numberCount;
  }
  - (int)numberCount
  {
    int count = 0;
    for (int i=0;i<self.length; i++) {
      unichar c = [self characterAtIndex:i];
      if (c >= '0' && c <= '9') {
        count++;
      }
    }
    return count;
  }
  @end

  //main.m
  #import <Foundation/Foundation.h>
  #import "NSString+Number.h"

  int main()
  {
    @autoreleasepool {
      int count = [@"s8dfdfs8df78sdf6s7" numberCount];
      NSLog(@"%d",count);
    }
    return 0;
  }

?

6.類的本質:

  1.當程序啟動時,就會加載項目中所有的類和分類,而且加載后會調用每個類和分類的+load方法。只會調用一次。

  2.當第一次使用某個類時,就會調用當前類的+initialize方法

  3.先加載父類,再加載子類(先調用父類的+load方法,再調用子類的+load方法)
  先初始化父類,再初始化子類(先調用父類的+initialize方法,再調用子類的+initialize方法,最后調用的initialize方法的內容會覆蓋前面所有initialize方法!)

7.description方法:

  NSLog(@"%@",c);語句執行前會:
  1.會調用類的+description方法
  2.拿到+description方法的返回值(NSString *)顯示到屏幕上

  // 默認情況下,利用NSLog和%@輸出對象時,結果是:<類名:內存地址>
    // 1.會調用對象p的-description方法
    // 2.拿到-description方法的返回值(NSString *)顯示到屏幕上
    // 3.-description方法默認返回的是“類名+內存地址”

      // 輸出行號
      NSLog(@"%d",__LINE__);
      // NSLog輸出C語言字符串的時候,不能有中文
      // NSLog(@"%s", __FILE__);
      // 輸出源文件的名稱
      printf("%s\n"__FILE__);
      test9();
      Person *p = [[Person alloc] init];
      // 指針變量的地址
      NSLog(@"%p",&p);
      // 對象的地址
      NSLog(@"%p",p);
      // <類名:對象地址>
      NSLog(@"%@",p);

?

8.SEL:

  SEL其實是對方法的一種包裝,將方法包裝成一個SEL類型的數據,去找對應的方法地址。找到方法地址就可以調用方法

  其實消息就是SEL

    // 直接調用test2方法
      Person *p = [[Person alloc] init];
      [p test2];

    // 1.間接調用test2方法
      NSString *name = @"test2";
      SEL s = NSSelectorFromString(name);//將OC字符串轉為SEL對象
      [p performSelector:s];//通過SEL對象間接調用方法test2

    // 2.間接調用test2方法
      [p performSelector:@selector(test2)];
      [p test3:@"123"];
      
      SEL ss = @selector(test3:);//將方法名test3轉為SEL對象
      [p performSelector:ss withObject:@"456"];//通過SEL對象間接調用方法test3
      [p test2];
      
    // 1.把test2包裝成SEL類型的數據
    // 2.根據SEL數據找到對應的方法地址
    // 3.根據方法地址調用對應的方法

?

?

?

轉載于:https://www.cnblogs.com/tzktzk1/p/3329615.html

總結

以上是生活随笔為你收集整理的id、构造方法、Category 分类、类的本质、description方法、SEL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。