原创

类与对象


创建对象并将地址赋值给p1
person *p1 =[person new];
nil和NULL
1.null

只能作为指针变量的值,等价于0,不指向任何一块空间,其实是个宏

2.nil

同上

3.使用建议

不建议随便使用,c指针用null(不指向空间),oc指针用nil(不指向对象)

4.person *p1=nil会报错,因为p1没指向任何一个对象,如果p1指针调用方法,不会报错,但是方法不会执行
内存中五大区域
栈 存储局部变量
  1. 堆 程序员手动申请的字节空间 malloc calloc realloc 函数
  2. bss段 存储为被初始化的全局变量 静态变量。
  3. 数据段(常量区)存储已被初始化的全局 静态变量 常量数据
  4. 代码段 存储代码 存储程序的代码
类加载
  1. 在创建对象的时候 肯定是需要访问类的
  2. 声明一个类的指针变量也会访问类 在程序运行期间,当某个类第一次被访问的时候,会将这个类存储到内存中的代码段区域,这个过程叫类加载 只有类在第一次访问的时候,才会做类加载 一旦类被加载到代码段以后。直到程序结束的时候才会被释放
对象在内存中究竟是如何存储的。

假设下面这个写在函数之中, Person *p1=[person new]

  1. person *p1会在内存中申请一块空间,在栈内存中申请一个Person类型的指针变量p1
  2. p1是一个指针变量,那么只能存储地址
    
  3. 【person new】;真正在内存中创建对象的其实是这段代码
new做的事情
  1. 在堆内存中申请一块合适大小的空间
  2. 在这个空间中根据类的模版创建对象-
  • 类模版中定义了什么属性,就把这个属性依次的声明在对象之中。
  • 对象中还有另外一个属性,叫isa是一个指针,指向对象所属的类在代码段中的地址 3.初始化对象的属性 如果属性的类型是基本数据类型,那么赋值为0 如果属性的类型是C语言的数据类型,那么赋值为NUll 如果属性的类型是OC的类指针类型,那么赋值为nil 4.返回对象的地址

(3)注意 a。对象之中只有属性,没有方法,自己类的属性加一个isa指针指向代码段中的类 b。如何访问对象的属性 指针名->属性名 c。如何调用方法 【指针名 方法名】 先根据指针找到对象,对象发现要调用的方法,再根据对象的isa指针找到类 然后调用类里的方法 (4)为什么不把方法存储在对象中? 存储在对象会导致方法冗余,每写一个对象都要存储。 (5)如果创建一个对象并没给其赋值,其默认值为: 如果属性的类型是基本数据类型,那么赋值为0 如果属性的类型是C语言的数据类型,那么赋值为NULL 如果属性的类型是OC的类指针类型,那么赋值为nil

导航
#pragma mark 这是一个导航
//水平线
#pragma mark -
#pragma mark - 水平线下的导航
#pragma mark 这也是一个导航
方法与函数

1函数 void test() { } 2方法 -(void)sayHi 3相同点 都是用来封装一段代码的,将一段代码封装其中,表示一个相对独立的功能 函数或者方法只要被调用,那么封装在其中的代码就会自动执行 4不同点 (1)语法不同 (2)定义的位置不同 方法的声明只能定义在@interface的大括号外面,实现只能写在@implementation之中。 函数除了@interface的大括号里面和函数的内部,其他地方都可以写 就算把函数写在类中,函数也不属于类 所有创建的对象中也没有这个函数,所以不要在类中写函数 (可以,但极度不规范) (3)调用的方法不一样 函数可以直接调用 方法要先创建对象 (4)方法属于类,有家庭,有归属感,而函数则独立

常见错误

@interface @implementation 1两者不能嵌套,顺序不能改变 2声明和实现都要有 3声明要放在使用类的前面,实现可以放在后面 4特殊情况可以只有实现(千万别用,不规范) 5属性名一定要以下划线开头,这是规范,类名首字母要大写 6属性不允许声明时初始化(赋值) 7oc方法必须要创建对象通过对象名来调用 8方法只有声明,没有实现 a.虽然只有警告 b.指针调用方法,运行时报错

IDEA
学习