5-类创建相关

People Lack Willpower,Rather Than Strength!

1..m中的私有成员/方法

  • 私有成员变量

    • 在.m文件中声明的成员变量是@private的
    • 在.m中定义的成员变量不能和它的头文件.h中的成员变量同名
    • 使用@public等关键字也是徒劳的。因为外界根本无法知道其存在
  • 私有方法

    • 概念:只有实现没有声明的方法
    • 原则:私有方法只能在本类中的方法的中才能调用。

      OC中没有真正的私有方法
      先通过获得其SEL,再performSelector就可以实现.

2.编译器指令

  • 概念:编译器指令就是用来告诉编译器要做什么!

    编译器指令有哪些?
    ./@property/@synthesize/super/???对吗??

  • @property
    作用:在声明文件中告诉编译器声明成员变量的的访问器(getter/setter)方法.
    私有属性:自动生成的成员变量是私有变量, 声明在.m中.

  • @synthesize
    作用:用在实现文件中告诉编译器实现成员变量的的访问器(getter/setter)方法
    注意点:
    - @synthesize age;和@synthesize _age;不同
    - 和@synthesize age = _age;也不同.
    - 可以一行搞定多个属性:@synthesize age = _age, name = _name;

3.id类型

  • 静态类型:将一个指针变量定义为特定类的对象时,使用的是静态类型,在编译的时候就知道这个指针变量所属的类,这个这个变量总是存储特定类的对象。
  • 动态类型:这一特性是程序直到执行时才确定对象所属的类
    • 动态类型典型代表:id类型.

      • 使用注意:
        1. 在id的定义中,已经包好了*号。Id指针只能指向OC中的对象
        2. 为了尽可能的减少编程中出错,Xcode做了一个检查,当使用id 类型的调用本项目中所有类上都没有的方法,编译器会报错
        3. id类型不能使用.语法, 因为.语法是compile time特性, 而id是run time特性🐷
    • 动态类型的类型判断:

        • (BOOL)isKindOfClass:classObj 判断实例对象是否是这个类或者这个类的子类的实例
        • - (BOOL) isMemberOfClass: classObj 判断是否是这个类的实例
        • + (BOOL) isSubclassOfClass:classObj 判断类是否是指定类的子类

      动态类型变量runtime就是先通过上述方法先给id变量确定类型,然后再将确定实例对象的属性和方法(该处设计到消息反馈)绑定到该变量上(动态绑定)! 可见动态绑定的基础是动态类型,不过多态应该是个特例????😖😖???

4.new实现原理

  • (1)使用alloc方法来分配存储空间(返回分配的对象);是类方法
  • (2)使用init方法来对对象进行初始化。是对象方法
  • (3)返回对象的首地址
 This method is a combination of alloc and init. Like alloc, it initializes the isa instance variable of the new object so it points to the class data structure. It then invokes the init method to complete the initialization process.
  • 说明alloc/init作用:
    • alloc: 方法为对象分配存储空间,并将所分配这一块区域全部清0.还有isa指针指向Class data structure.
        The isa instance variable of the new instance is initialized to a data structure that describes the class; memory for all other instance variables is set to 0.
    
    • init:init方法是初始化方法(构造方法),用来对象成员变量进行初始化,默认实现是一个空方法。
    An object [isn’t ready to be used] until it has been initialized. The init method defined in the NSObject class does no initialization; it simply returns self.
    

    但需要注意:alloc 与 init合起来称为构造方法,表示构造一个对象!
    虽然new和alloc/init 作用是一样的,但是iOS程序员还是用后者多,便于统一化管理!!

5.init方法重写

  • 1.格式:
- (instancetype)init 
{ 
    self = [super init];
    if (self) {
        // Initialize self.
    } 
    return self; 
} 
+ [super init]的作用: 面向对象的体现,先利用父类的init方法为子类实例**继承自父类父类部分属性**初始化。
    > 可见,虽然调用的是父类的对象方法,但是确实为我子类的对象做事!
    > (self是隐式参数,实际init消息的receiver是self).
+ [super init]为什么要赋值给self :简单来说是为了防止父类的初始化方法**release掉了self指向**的空间并重新alloc了一块空间。还有[super init]可能alloc失败,这时就不再执行if中的语句。
  • instancetype与id:

    • instancetype只能作为方法返回值,它会进行类型检查
    • id可作为返回值/参数/用来定义变量
  • 自定义构造方法

    • 自己的事情自己做,父类的属性交给父类的方法来处理,子类的方法处理子类自己独有的属性!
  • 类工厂方法:

    • 是一种用于分配、初始化实例并返回一个它自己的实例的类方法

    • 只用操作一次!instancetype返回.

      • 注意:子父类中的类工厂方法--->类方法创建初始化对象,写self不要直接写类名!!!

6.类的本质

No. 本质说明
1 一个对象(类对象)
2 第一次使用该类的时候被创建,在整个程序中只有一份。
3 在程序运行时一直存在。
4 是一种数据结构,存储类的基本信息:类大小,类名称,类的版本,继承层次,以及消息与函数的映射表等.可见:􏰁类对象简述了一系列它的实例的特点,包括成员变量的列表,成员函数的列表等
5 代表类,Class类型,对象方法属于类对象
6 所有类的实例都由类对象生成,类对象会把实例的isa的值修改成自己的地址.

7.类的启动过程

    1. +load方法
    • 在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法(只会调用一次),无论用不用!
    • 加载顺序:父类->子类;原始类->分类;
    1. +initialize
    • 概念:在第一次使用某个类时(比如创建对象等),只会调用一次+initialize方法
    • 顺序:父类-> 子类;
    • 作用:创建类对象.

8.SEL类型

  • 每个方法都有一个与之对应的SEL类型的对象,根据一个SEL对象就可以找到方法的地址,进而调用函数.

  • 这么看,SEL算是方法的签名.

  • 第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候,直接到类对象缓存中找!。

    子类与父类之间是:isA的关系; 对象与类之间也是isA关系!

  • 使用:

    • 1.包装某个方法名:
         SEL sel = @selector(show);
         NSString *s = [NSString stringFromSelector:@selector(demo)];
    
    • 2.检验对象是否实现了某个方法:
        - (BOOL) respondsToSelector: (SEL)selector //判断实例是否实现这样方法
        + (BOOL)instancesRespondToSelector:(SEL)aSelector;
    
    • 3.让对象执行某个方法
        - (id)performSelector:(SEL)aSelector; // 无参数
        - (id)performSelector:(SEL)aSelector withObject:(id)object;// 一个参数
        - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;// 两个参数
    
  • 4.作为参数

    • 给类对象发送消息(调用类方法):

    先到元类对象中找,找不到,去父元类对象中找,直到NSObject,
    这也是为什么root Class要继承自NSObject,可见NSObject中声明的方法是最全面的!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容