Objective-C 学习第二天

简介: 一、 对象在内存中的存储内存中的五大区域栈 存储局部变量堆 程度员手动申请的字节看空间 malloc calloc realloc函数BSS段 存储未被初始化的全局变量, 静态变量数据段(常量区) 存储已被初始化的全局、静态变量、常量数据代码段 存储代码 存储代码程序类加载a.

一、 对象在内存中的存储

  1. 内存中的五大区域
    栈 存储局部变量
    堆 程度员手动申请的字节看空间 malloc calloc realloc函数
    BSS段 存储未被初始化的全局变量, 静态变量
    数据段(常量区) 存储已被初始化的全局、静态变量、常量数据
    代码段 存储代码 存储代码程序

  2. 类加载
    a. 在创建对象的时候 肯定需要访问类
    b. 声明1个类的时候指针变量也会访问类
    类加载: 在程序运行期间,当某个类第1次被访问的时候就会把类加载到代码段
    只有类在第1次被访问的时候,才会做类加载. 一旦类被加载到代码段后,直到程序结束的时候才会被释放

  3. 对象在内存中究竟是如何存储的
    假设下面这个写在函数中
    Person *p1 = [Person new];

    1. Person *p1 : 会在栈内存中申请1空间,在栈内存中声明1个Person类型的指针变量,
      p1是指针变量,只能存储地址
    2. new做的事情:
      a. 在堆内存中申请1块合适大小的空间
      b. 在这个控件中根据类的模板创建对象
      依次声明属性,对象还有额外的一个属性,叫isa是一个指针。
      isa指向所属的类在代码段当中的地址.
      c. 初始化对象的属性
      如果属性的类型是基本数据类型,就赋值为0;
      如果属性的类型是C语言的指针类型,就赋值为NULL;
      如果属性的类型是OC语言的指针类型,就赋值为nil;
      d. 返回对象的地址
    3. 注意
      a. 对象当中只有属性,而没有方法, 自己类的属性外加1个isa指针指向代码段中的类
      b. 如何访问对象的属性
      指针名->属性名;
      根据指针 找到指针指向的对象 再找到对象中的属性来访问
      c. 如何调用方法
      [指针名 方法名];
      先根据指针名找到对象,对象发现要调用方法 再根据对象的isa指针找到类,然后调用类里的方法
  4. 为什么不把方法存储在方法之中
    因为每个对象的方法实现代码都是一模一样的,所以只保存一份来节省空间

  5. 对象属性的默认值
    如果我们创建一个对象,每一为对象的属性赋值,这个对象是有值的。
    如果属性的类型是基本数据类型,就赋值为0;
    如果属性的类型是C语言的指针类型,就赋值为NULL;
    如果属性的类型是OC语言的指针类型,就赋值为nil;

  6. NULL与nil
    1). NULL
    只能可以作为指针变量的值,如果1个指针变量的值是NULL代表这个指针不指向内存中的任何一块空间,NULL其实等价于0.是一个宏
    #define NULL ((void *)0)
    2). nil
    只能作为指针变量的值. 代表这个指针不指向内存中的任何空间.
    nil也等价于0 也是一个宏

    所以NULL和nil是一样的

    3). 使用建议
    a. C指针用NULL值
    int *p = NULL;
    b. OC的类指针用nil
    Person *p = nil;

    4). 如果1个类指针的值为nil,代表这个指针不指向任何对象
    Person *p = nil;
    不能向它的属性赋值, 对象的方法不会执行.

  7. 同类型的指针变量之间是可以相互赋值的

  8. 分组导航标记
    导航栏中的main.m后的No Selection点击选择方法或类

    1. #pragma mark 分组名
      在@interface和@implementation上方添加
    2. #pragma mark -
      在导航条对应的位置显示一条水平分割线
    3. #pragma mark - 分组名
      在导航条对应的位置产生一条水平分割线,再产生分组名
  9. 函数和方法对比

    1. 在C中学习的叫做函数
      void test(){}
    2. 在OC类当中写的叫方法
      • (void)sayHi;
    3. 相同点:
      都是用来封装代码,表示一个相对独立的功能
    4. 不同点:
      a. 语法不同.
      b. 定义的位置不一样
      OC方法的声明只能写在@interface的大括弧外面,实现只能写在@implementation.
      函数除了函数的内部和@interface大括弧之中,其他地方都可以写
      c. 调用的方式不同:
      函数可以直接调用, 方法必须要创建之后调用
      d. 方法是属于类的, 函数是对立的
  10. 最容易犯的错
    1). @interface与@implementation不能相互嵌套
    2). 类必须要先声明
    3). 类的声明和实现必须都有要
    4). 类的声明必须要放在使用类之前,实现可以放在其后
    5). 声明类的时候,声明和实现必须要同时存在.
    特殊情况: 可以只有实现,没有声明. 但不可这么写
    6). 属性名一定要以下划线开头, 类名首字母要大写
    7). 属性不允许声明的时候赋值
    8). OC方法必须要创建对象通过对象名来调用
    9). 方法不能只声明不实现
    unrecognized selector sent to instance 0x100420510
    方法不存在或者没有实现

二、多文件开发

  1. 多文件开发
    把1个类写在一个模块当中, 而一个模块至少两个文件
    .h 头文件
    写类的声明
    .m 实现文件
    写类的实现

  2. 简洁方式
    NewFile->Cocoa Class即可

  3. 对象和方法
    对象作为方法的参数, 对象作为方法的返回值
    1). 类的本质是我们自定义的数据类型
    什么是数据类型: 是在内存中开辟空间的模板
    2). - (void)test:(Dog *)dog;
    3). 当对象作为方法参数传递的时候,是地址传递.

  4. 对象作为方法的返回值

    • (Dog *)product;
  5. 对象作为类的属性
    1). 一个Target中的类无法直接在另一个Target中使用
    2). 属性的本质是变量

        @interface Person : NSObject {
            Dog *dog;
        }
        @end
    
  6. 本类对象作为本类方法的参数

        @interface Dog : NSObject{
            int _age;
        }
        - (BOOL) compare: (Dog *)dog;
        @end
    
        @implementation Dog
        - (BOOL) compare: (Dog *)dog{
            return _age > dog->_age;
        }
        @end
    
目录
相关文章
|
存储 Java 程序员
C++ 开发者快速学习 Objective-C 语言核心语法
本文将讨论 Objective-C 语言的核心语法。这部分开始详述一些具体的语法。正如你期待的一样,涉及到了定义和类。
257 0
|
存储 C语言 iOS开发
Objective-C 学习第一天
一、基础语法 OC相对于C a. 在C的基础上新增了面向对象的语言 b. 将C的复杂、繁琐的语法封装的更为简单 c. OC完全兼容C语言 OC程序的源文件后缀名是.m m代表message 代表OC当中最重要的一个机制 消息机制 C程序的源文件的后缀名.c main函数仍然是OC程序的入口和出口 int类型的返回值代表程序的结束状态 main函数的参数: 仍然可以接收用户在运行程序的时候传递数据给程序, 参数也可以不要 #import指令 1). 以#号开头,是1个预处理指令 2). 作用: 是#include指令的增强版。
844 0
|
存储 iOS开发
Objective-C 学习第三天
封装 一、 什么是错误 一般情况下,错误是指源代码不符合语法规范,然后编译报错 后果: 程序无法编译 什么是Bug? 程序可以编译、链接、执行,但是程序执行的结果不是我们预想的。
923 0
|
存储 iOS开发
Objective-C 学习第四天
一、 Xcode文档的安装 1). Xcode文档提供了很多框架, 框架当中有很多类和函数, 提供的一些数据类型. 2). Xcode文档需要单独安装.
925 0
|
存储 iOS开发 编译器
Objective-C 学习第五天
一、 创建一个对象,内存是如何分配 1). 子类对象中有自己的属性和所有父类的属性 2). 代码段中每一个类都有一个isa指针,这个指针指向它的父类. 结构体与类 相同点: 都可以将多个数据封装为1个整体 struct Data{ ...
678 0
|
存储 安全 iOS开发
Objective-C 学习第六天
一、 内存管理 内存的作用: 存储数据. 1). 如何将数据存储到内存之中 声明1个变量,将这个数据存储进去 2). 当数据不再被使用的时候,占用的内存空间如何被释放 内存中的五大区域 栈:局部变量,当局部变量的作用域被执行完毕之后,这个局部变量就会被系统立即回收.
991 0
|
存储 对象存储 iOS开发
Objective-C 学习第七天
一、 自动释放池的原理 存入到自动释放池中的对象,在自动释放池销毁的时候,会自动调用储存在该自动释放池中的所有对象的release方法. 可以解决的问题: 将创建的对象,存入到自动释放池之中,就不再需要手动的release这个对象了,因为池子销毁的时候,就会自动的调用池中所有的对象release.
862 0
|
存储 iOS开发
Objective-C 学习第八天
一、延展 延展: Extension 1). 是一个特殊的分类,所以延展也是类的一部分 2). 特殊之处: a. 延展这个特殊的分类没有名字 b. 只有声明没有实现,和本类共享一个实现 延展的语法 语法: @interface 本类名 () @end 没有实现,和本类共享一个实现.
857 0
|
存储 iOS开发 对象存储
Objective-C 学习第九天
一、 框架: 系统或者第三方事先写好的写很牛X功能的类,把这些类交给我们使用,这些类的集合就叫框架. Foundation框架: 是一个包,有很多类和函数,定义了一些数据类型.
953 0
|
存储 对象存储 iOS开发
Objective-C 学习第十天
一、NSDictionary NSArray和NSMutableArray数组 存储数据特点:每个元素紧密相连,并且每个元素中都是直接存储的值. 缺点:数组元素下标不固定,都有可能发生变化,无法通过下标来唯一确定数组中的元素.
812 0