内存中的五大区域

  • 栈:存储局部变量,局部变量作用域执行完会被立即回收
  • 堆:程序员手动申请的字节空间 malloc calloc realloc
  • BSS段:存储未被初始化的全局变量和静态变量,初始化后回收并转到数据段中
  • 数据段(常量区):存储已经被初始化的全局 静态变量 常量数据,程序结束回收
  • 代码段:存储代码,程序结束回收

栈、BSS段、数据段、代码段存储在他们中的数据回收,是由系统自动完成
分配在堆区中的OC对象是肯定需要被回收的,需要内存管理

类的定义

  • 类的声明:类名需要大写开头,属性开头下划线
 @inteface 类名: NSObject{@public // 外部可以访问NSString *_name;int _age;}// 方法-(void)run;@end
  • 类的实现
@implementation 类名
- (void)run { // 方法的实现NSLog(@"run!")
}
@end
  • 对象的创建
 类名 *对象名 = [类名 new]Person *p1 = [Person new];
  • 对象的使用:默认不可被外界访问,如果允许需要加@public关键字
 // 两种方式都可以对象名-> 属性名 = 值;//建议使用(*对象名).属性名;p1->_name = @"jack";(*p1)._name = @"jack";

类的方法

  • 无参数方法:位置在@interface{}外面
- (返回值类型)方法名称;
- (void)run;
  • 无参数方法的实现(参考上诉类的实现)
  • 无参数方法的调用
 Person *p1 = [Person new];[p1 run];
  • 带1个参数的方法:位置在@interface{}外面,名称最好为xxxxWith
- (返回值类型)方法名称:(参数类型)参数名称;
- (void)eatWith:(NSString *)foodName;
  • 带1个参数方法的调用
 Person *p1 = [Person new];[p1 run];[p1 eatWith:@"红烧肉"]
  • 带多个参数的方法:位置在@interface{}外面,名称最好加Withand
- (返回值类型)方法名称:(参数类型)参数名称 :(参数类型)参数名称 :(参数类型)参数名称;
- (void)sum:(int)num1 :(int)num2 :(int)num3;
- (void)sumWith:(int)num1 and:(int)num2 and:(int)num3;
  • 带多个参数方法的调用
 Person *p1 = [Person new];[p1 run];[p1 eat:@"红烧肉"];int sum = [p1 sum:10 :20 :30];int sum = [p1 sumWith:10 and:20 and:30];

类加载

  • 程序运行期间,当类被第一次访问,会将其存储到代码段区域,叫做类加载
  • 直到程序结束才会被释放

对象在内存中存储

代码段
指针变量 对象(属性) isa指针
  • 内存中申请1块空间存放指针变量
  • 内存创建1块大小合适的空间,根据类的模板创建对象
  • 对象会有isa指针指向代码段的对象所属的类
  • 初始化对象的属性,如果是基本数据类型为0,C语言指针为NULL,OC的类指针类型为nil
  • 访问对象属性:指针名->属性名;
  • 调用方法:[指针名 方法名];
    根据指针名找到在的对象,发现对象调用方法,再根据对象的isa指针在代码段找到类,然后调用类里面的方法
  • 每个对象的方法代码实现一样,没必要为每个对象保存一个方法,浪费空间,所有将其存在代码段里面
  • 代码段中每个类都有isa指针,指向他的父类

对象作为参数或者返回值

- (void)test:(Dog *)dog;
- (Dog *)test:(Dog *)dog;
  • 本质是地址传递

注意事项:一个Target中的类无法直接再另一个Target中使用

  • instancetype作为返回值指返回类型为该类

对象方法

  • 对象方法需要创建对象 ,可以直接调用类方法
- (返回值类型)方法名;

类方法

  • 类方法不依赖对象,直接通过类名调用
  • 优点:节约空间,提高效率,跳过堆,直接执行类中的类方法
  • 缺点:不能直接访问属性,也不能通过self直接调用当前类的其他的对象方法,但是可以在类方法创建对象并访问属性,
// 声明
+ (返回值类型)方法名;
// 调用
[类名 类方法名]
  • 类方法的规范:如果要求这个类提供一个和类同名的类方法,这个方法创建一个最纯洁的对象返回
  • 类方法和对象方法可以重名

对象方法中的self

  • self是一个指针,在对象方法中self指向当前对象,在类方法中指向当前类
  • 如果在方法中存在和属性同名的局部变量,访问局部变量直接写,访问对象同名属性,必须用self
  • 在对象方法中调用当前对象其他对象方法,必须使用self

类方法中的self

  • self指针指向代码段中的这个类的地址

匿名对象

  • 没有名字的对象,没有指针存储其地址,只能使用一次,每次创建都是不同的对象
  • new实际上是一个类方法,可以创建匿名对象

面向对象的三大特征(封装、继承、多态)

封装

  • 屏蔽内部实现,方便操作,后期维护方便
  • 实现方法:去掉@public,方法名需要set/get开头,首字母大写,去掉下划线

对象之间的关系

  • 组合关系:一个类是由其他几个类组合起来的
  • 依赖关系:一个对象的参数是另一个对象
  • 关联关系:一个类拥有另外一个类

继承

  • 继承后拥有父类所有成员,属性,方法
  • 不继承默认NSObject
  • 只能有一个父类,不能同时继承多个
  • 子类不能再定义一个同名的属性
@interface 类名 :父亲类的名称@end

A从B继承,A是子类,B是父类
A从B派生,A是派生类,B是基类

重写

直接在类的实现中将方法重写

多态

同一个行为,不同事物不同表现

  • 通过继承+重写+里氏替换原则
  • 或者通过设计模式

里氏替换原则

子类可以替换父类的位置,并且程序并不受影响

 // 里氏替换原则Father *p = [Son new];
  • 1个指针不仅可以存储本类对象的地址,还可以存储子类对象的地址
  • NSOject类型指针可以存储任意OC对象的地址
  • 数组元素是OC指针类型,这个数组可以存储子类和父类对象
  • 数组元素是NSObject指针类型,任意OC对象都可以存储
  • 当父类指针指向子类对象的时候,这个父类指针只能去调用子类对象中的父类成员,子类独有的无法访问,如果重写则是重写完的方法
  • 如果指向子类对象的独有方法,就必须做类型转换
 NSObject *obj1 = [Person new];//强制转换数据类型[(Person *)obj1 sayHi];

NSObject类

NSObject类是Foundation框架的类,这类有个类方法new,这个方法是用来创建对象,方法的返回值是创建这个对象的指针,这个类有个属性叫做isa指针
NSObject类是所有OC类的基类,根据LSP NSObject指针就可以指向任意OC对象,所有NSObject指针是一个万能指针

id指针

万能指针,可以指向任意的OC对象
id是一个typedef自定义类型,在定义的时候已经加了*,所有声明不需要再加
id指针不能用点语法

  • id指针和NSObject指针的相同点:万能指针,都可以执行任意的OC对象
  • id指针和NSObject指针的不同点:NOSject指针调用对象方法,编译器会检查,而id指针不会,故正常用id指针
//可被继承的创建自身类对象
+ (id)newself {return [self new];
}

instancetype类型

方法的返回值是instancetype,代表方法的返回值是当前这个类的对象

  • idinstancetype的区别:instancetype只能做方法的返回值,不能在别的地方使用,id既可以声明指针变量,也可以作为参数和返回值

Super关键字

  • 只可以用在类方法和对象方法中,不可以调用属性
  • 在对象方法和类方法中可以使用super关键字调用当前对象从父类继承过来的对象方法,也可以通过self来调用

访问修饰符

@private//私有的,只能在本类的方法实现中访问,子类继承属性但不能直接访问,但可以调用父类的方法
@protected//受保护的,只能在本类和子类中的方法访问
@package//可以在当前框架中访问
@public//可以在任意地方访问
  • 不指定默认为protected
  • 作用域是修饰符到另一个修饰符为止
  • 修饰符只能修饰属性,不能修饰方法

私有属性

@implementation {属性//真正的私有属性,修饰符无效,外界不显示
}

私有方法

方法不写声明只写实现,只能在本类中的其他方法调用,不能被外界调用

@class的使用

  • 当两个类相互包含的时候,Person.h中包含Book.h,而Book.h又包含Person.h的时候,就会出现循环引用的问题,无限递归导致编译无法通过
  • 解决方案:其中一边不要使用#import引入对方的头文件,而是使用@class 类名;来标注这是一个类,在.m文件中再引入对方的头文件

#import是将指定文件的内容拷贝到写指令的地方
@class并不会拷贝任何内容,只是告诉编译器这个一个类

iOS开发之OC入门(类的基础知识)相关推荐

  1. iOS开发之OC入门(类的使用)

    占位符 %p打印指针的值 %@打印指针对应的值,输出的格式:<对象所属的类名:对象的地址> NSLog%@方法调用传入对象的description的方法,拿到该方法的返回值,这个返回值是一 ...

  2. 李洪强iOS开发之OC[012] -类的声明实现小结

    // //  main.m //  11 - 内容总结 // //  Created by vic fan on 16/7/9. //  Copyright © 2016年 李洪强. All righ ...

  3. ios开发之OC基础-类和对象

    ios开发之OC基础-类和对象 本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录 ...

  4. ios c语言调用oc方法,ios开发之OC基础-类和对象(示例代码)

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  5. (0085)iOS开发之OC与JS交互高级用法(JavaScriptCore)

    前述:JavaScriptCore你不知道的OC与JS之间交互.OC与JS之间用model实现交互.通讯.传值!好玩! 几乎三年来一直断断续续接触OC与JS交互,每次觉得UIWebView OC与JS ...

  6. iOS开发之oc(五)--成员变量(实例变量)

    (一)1.书写位置 成员变量也叫实例变量,是写在 @interface   { // 写在这里的,比如 int _age; } @end 成员变量的命名规范  成员变量都以下划线 _ 开头,好处: 1 ...

  7. iOS开发之oc(二十)--Foundation(5)NSDictionary

    /*  集合  1.NSArray\NSMutableArray •有序 •快速创建(不可变):@[obj1, obj2, obj3] •快速访问元素:数组名[i]   2.NSSet\NSMutab ...

  8. iOS开发之Objective-C(基础篇)-李飞-专题视频课程

    iOS开发之Objective-C(基础篇)-232人已学习 课程介绍         该系列课程是iOS开发之Objective-C基础入门视频.课程中会详细的讲解OC语法特点,面向对象的使用,循环 ...

  9. iOS开发之c语言入门教程

    苹果作为移动互联的高端品牌,iOS操作系统也被用户公认为是最好用的移动互联网操作系统.据了解,曾一度拒绝为iOS平台对出浏览器的火狐在今年5月份的时候,他们却食言了.今天,Mozilla宣布iOS版F ...

最新文章

  1. linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)
  2. 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
  3. java椭圆 类_java 椭圆算法
  4. oracle jdedward,Oracle JDEdwards EnterpriseOne Tools任意文件上传漏洞(CVE-2011-2317)
  5. Storm教程1理论介绍
  6. POJ 1804 逆序数 解题(归并排序)
  7. 3-4numpy聚合操作和arg(索引)运算和排序
  8. 08 Tomcat+Java Web项目的创建和War的生成
  9. backbone入门系列(4)集合
  10. Linux下SHELL的PS1变量简介
  11. mysql取值范围1-10_MySQL字段的取值范围
  12. python 2.7.9 安装beautifulsoup4
  13. 联想电脑无法修复此计算机怎么办,联想一键还原不能用怎么办
  14. Canvas Api(全)
  15. 嫡权法赋权法_组合赋权法确定权重的方法探讨
  16. Android调试办法之adb指令解锁手机锁屏
  17. [论文阅读] (21)SP21 Survivalism: Systematic Analysis of Windows Malware Living-Off-The-Land (经典离地攻击51)
  18. DAX:LOOKUPVALUE 函数
  19. 【焊接】 焊接技巧
  20. valist:解决变参问题

热门文章

  1. Hevc 的档次和层级
  2. 东北林大计算机考研难吗,一位考取东北林大信息学院农业信息化学姐的考研经验分享...
  3. JavaScript 操作元素案例练习
  4. warning: #223-D: function “xxx“ declared implicitly
  5. java调用插件_从任何java应用程序调用自己的eclipse插件方法
  6. 消息通知中台:websocket 网页通知插件
  7. 从入职到离职的收获——ICT四个月
  8. 2019年1月8日个人总结
  9. win7系统环境变量path默认值
  10. Linux回收站——用del替换rm