iOS开发之OC入门(类的基础知识)
内存中的五大区域
- 栈:存储局部变量,局部变量作用域执行完会被立即回收
- 堆:程序员手动申请的字节空间
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
的{}
外面,名称最好加With
和and
- (返回值类型)方法名称:(参数类型)参数名称 :(参数类型)参数名称 :(参数类型)参数名称;
- (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
,代表方法的返回值是当前这个类的对象
id
和instancetype
的区别: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入门(类的基础知识)相关推荐
- iOS开发之OC入门(类的使用)
占位符 %p打印指针的值 %@打印指针对应的值,输出的格式:<对象所属的类名:对象的地址> NSLog%@方法调用传入对象的description的方法,拿到该方法的返回值,这个返回值是一 ...
- 李洪强iOS开发之OC[012] -类的声明实现小结
// // main.m // 11 - 内容总结 // // Created by vic fan on 16/7/9. // Copyright © 2016年 李洪强. All righ ...
- ios开发之OC基础-类和对象
ios开发之OC基础-类和对象 本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录 ...
- ios c语言调用oc方法,ios开发之OC基础-类和对象(示例代码)
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- (0085)iOS开发之OC与JS交互高级用法(JavaScriptCore)
前述:JavaScriptCore你不知道的OC与JS之间交互.OC与JS之间用model实现交互.通讯.传值!好玩! 几乎三年来一直断断续续接触OC与JS交互,每次觉得UIWebView OC与JS ...
- iOS开发之oc(五)--成员变量(实例变量)
(一)1.书写位置 成员变量也叫实例变量,是写在 @interface { // 写在这里的,比如 int _age; } @end 成员变量的命名规范 成员变量都以下划线 _ 开头,好处: 1 ...
- iOS开发之oc(二十)--Foundation(5)NSDictionary
/* 集合 1.NSArray\NSMutableArray •有序 •快速创建(不可变):@[obj1, obj2, obj3] •快速访问元素:数组名[i] 2.NSSet\NSMutab ...
- iOS开发之Objective-C(基础篇)-李飞-专题视频课程
iOS开发之Objective-C(基础篇)-232人已学习 课程介绍 该系列课程是iOS开发之Objective-C基础入门视频.课程中会详细的讲解OC语法特点,面向对象的使用,循环 ...
- iOS开发之c语言入门教程
苹果作为移动互联的高端品牌,iOS操作系统也被用户公认为是最好用的移动互联网操作系统.据了解,曾一度拒绝为iOS平台对出浏览器的火狐在今年5月份的时候,他们却食言了.今天,Mozilla宣布iOS版F ...
最新文章
- linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)
- 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
- java椭圆 类_java 椭圆算法
- oracle jdedward,Oracle JDEdwards EnterpriseOne Tools任意文件上传漏洞(CVE-2011-2317)
- Storm教程1理论介绍
- POJ 1804 逆序数 解题(归并排序)
- 3-4numpy聚合操作和arg(索引)运算和排序
- 08 Tomcat+Java Web项目的创建和War的生成
- backbone入门系列(4)集合
- Linux下SHELL的PS1变量简介
- mysql取值范围1-10_MySQL字段的取值范围
- python 2.7.9 安装beautifulsoup4
- 联想电脑无法修复此计算机怎么办,联想一键还原不能用怎么办
- Canvas Api(全)
- 嫡权法赋权法_组合赋权法确定权重的方法探讨
- Android调试办法之adb指令解锁手机锁屏
- [论文阅读] (21)SP21 Survivalism: Systematic Analysis of Windows Malware Living-Off-The-Land (经典离地攻击51)
- DAX:LOOKUPVALUE 函数
- 【焊接】 焊接技巧
- valist:解决变参问题
热门文章
- Hevc 的档次和层级
- 东北林大计算机考研难吗,一位考取东北林大信息学院农业信息化学姐的考研经验分享...
- JavaScript 操作元素案例练习
- warning: #223-D: function “xxx“ declared implicitly
- java调用插件_从任何java应用程序调用自己的eclipse插件方法
- 消息通知中台:websocket 网页通知插件
- 从入职到离职的收获——ICT四个月
- 2019年1月8日个人总结
- win7系统环境变量path默认值
- Linux回收站——用del替换rm