黑马程序员___OC类的加载和初始化

构造方法

完整的创建一个可用的对象需要两步

1.分配储存空间   +alloc

2.初始化   -init

Person *p1 = [Person alloc]

Person *p2 = [p1 init]

相当于:Person *p = [Person new] ,但是这个方法虽然可以快速创建一个新的对象,但是不能对新对象进行有选择的初始化

有时候我们想创建的对象都有一个初始值,这个时候就可以重写构造方法

- (id)init
{
    //一定要调用回super的init方法,初始化父类中声明的一些成员变量和其他属性
    self = [super init];

    //如果初始化成功,才有必要进行接下来的初始化
    if(self != nil)
    {
        _age = 10;  //使创建出来的age属性都是等于10
    }
    return self;
}

重写构造方法的注意点

1.先调用父类的构造方法[super init]

2.再进行子类内部成员变量的初始化

补充:

id :万能指针,能指向任何OC对象

类的本质

类本身也是一个对象,是个Class类型的对象,简称类对象  Class c = [Person class],利用Class创建Person对象。

类的加载和初始化

当程序启动时,会加载项目中所有的类和分类,而且加载后回调用每个类和分类的+load方法,而且只会调用一次

当第一次使用某个类创建对象的时候,就会调用当前类的+initialize方法,也就是初始化对象,使创建出来的对象可以使用

规律:

程序启动时,系统会先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法)

先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)

SEL

SEL是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法

[p test]  —>直接的调用test方法

SEL s = @selector(test)

[p performSelector:s] —>间接的调用test方法

在方法内部_cmd表示当前方法的SEL值,所以在方法实现的内部使用_cmd会引发死循环,比如:

- (void)test2
{
    // _cmd代表着当前方法

    NSString *str = NSStringFromSelector(_cmd);

    // 会引发死循环
    // [self performSelector:_cmd];

    NSLog(@"调用了test2方法-----%@", str);
}
时间: 2024-10-12 00:45:55

黑马程序员___OC类的加载和初始化的相关文章

黑马程序员————java中类的加载、反射、动态代理、枚举

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 类的加载.反射.动态代理.枚举 一.类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.加载: 就是指将class文件读入内存,并为之创建一个Class对象 ★★

&lt;&lt;黑马程序员&gt;&gt;类的加载和初始化

类的加载和初始化 + (void)load  方法   ①  当程序一启动就会把所有类和分类而且加载后就会调用每个类的+load方法只会调用一次.   ②  先加载父类在加载子类,每个类加载完就会调用load方法 2 . + (void)initialize    方法      ①  当第一次使用这个类时就会调用  + (void)initialize    方法 调用顺序:①  先加载父类在加载子类               ② 先调用父类的load方法在调用子类的load方法      

黑马程序员----类的加载和初始化

类的加载和初始化 当程序一启动,就会加载项目中所有的类和分类,而且加载后会调用每一个类和分类中的+load方法(即使不创建对象也会调用),且只会调用一次: 当第一次使用某个类时,就会调用当前类的+initialize方法: 先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法): 先初始化父类,再初始子类(先调用父类的+initialize方法,再调用子类的+initialize方法): 注意点:1.调用创建子类时即会调用父类的+initialize方法,也会调用子类的

java类的加载以及初始化顺序 .

类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题.从网上查阅了若干文章,现总结如下: 我们通过一段代码来了解类加载和初始化的顺序: package com.classloader.demo; class Insect {  private int i = 9;  protected int j;  Insect() {    System.out.println("i = " + i + ", j = " + j);    j = 3

黑马程序员_类对象创建代码的执行顺序测试总结

class StaticCode { // 类的非静态成员变量(实例变量)定义语句: // 作用:用来存储对象的特有数据的成员变量. // 运行:当类对象被创建时就执行,按照顺序自上而下执行,和构造代码块平级.(即当有多个构造函数 // 代码块和多个非静态成员变量时,JVM按照自上而下的顺序来执行所有语句,包括构造代码块里的代码 // 和非静态成员的声明.) // 存储位置:非静态变量位于堆内存中的对象实体中. int num = 3; // 构造代码块 { System.out.println

黑马程序员-OC类的本质,深入探讨,load方法和initialize方法

1:类的本质:类也是一种类,可以叫做类类,类对象,类类型: 2:类和对象在内存中分配问题(注意区分类的对象和类对象的概念) 类对象在内存中只有一份,且只加载一次,类对象中存放了类中定义的方法: 而成员变量和isa指针,存放在了类的对象中;isa指针指向了类对象:如图: 3:类本身也是对象,是class类型的对象: // 以person为例 Person *p1 = [[Person alloc] init]; Person *p1 = [[Person alloc] init]; // 获取类对

【转】JVM类的加载与初始化

版权声明: 本文原创作者:书呆子Rico 作者博客地址:http://blog.csdn.net/justloveyou_/ 摘要: 我们知道,一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述了类的各种信息,并且它们最终都需要被加载到虚拟机中才能被运行和使用.事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的类加载机制.本文概述了JVM加载类的时机和生命周

java类的加载与初始化总结

1.触发类加载的原因(主动调用与被动调用): 六种主动调用: 1).创建类的实例(new操作.反射.cloning.反序列化) 2).调用类的静态方法 3).使用或对类/接口的static属性赋值(不包括static final的与在编译期确定的常量表达式(包括常量.字符串常量)) 4).调用API中的反射方法,Class.forName()等. 5).子类被初始化 6).被设定为JVM启动时的启动类(含main方法的主类) 其它都为被动引用:被动引用不会触发类的初始化操作(只会加载.链接),如

Java类的加载 链接 初始化

原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始化这三个步骤.这三个步骤中,对开发人员直接可见的是Java类的加载,通过使用Java类加载器(class loader)可以在运行时刻动态的加载一个Java类:而链接和初始化则是在使用Java类之前会发生的动作.本文会详细介绍Java类的加载.链接和初始化的