Objective-C基础3
1.OC内存管理
1)范围:管理任何继承NSObject的对象,对其他的基本数据类型无效(堆区),否则会造成内存泄露
2)原理:任何对象都可能有用一个或多个所有者,只要一个对象至少还拥有一个所有者,它就会继续存在
3)对象的引用计数器,retain(+1)、release(-1)、retainCount得到引用计数器的值
4)内存管理的分类:MRC(手动管理)、ARC(自动管理)、垃圾回收(不支持)
2.引用计数器的使用
dealloc:释放对象
先调用[super dealloc]
我们创建一个项目,默认是ARC模式,先修改

//
// main.m
// 内存管理
//
// Created by fanyafang on 15/11/6.
// Copyright © 2015年 itcast. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) {
@autoreleasepool { Person *p =[[Person alloc]init]; NSUInteger count=[p retainCount]; NSLog(@"%lu",count); //Person *p2=p;//不变
//Person *p2=[p retain];//加1
[p retain];//加1 [p release];//减一
[p release];//减一自动调用dealloc方法
//证明p的空间被释放,可以在Person类中重写dealloc方法
}
return ;
}
3.内存管理的原则
1)只要有人使用这个对象,这个对象就不会被回收
2)只要你想使用这个对象,那么就应该让这个对象的引用计数器加1
3)当你不想使用这个对象时,应该让对象的引用计数器减1
4)谁创建(new、malloc、copy)谁release
5)谁retain谁release
4.如果一个对象已经被释放了,这个对象就成为僵尸对象,再去使用这个对象就没有意义,默认不报错,需要开启僵尸对象检测
不能使用retain让僵尸对象起死回生

5.对象nil 类Nil NULL NSNull是一个对象
避免使用僵尸对象的方法是,对象释放以后,给对象赋值为nil
6.多个对象的内存管理
在set函数中先release实例对象,再retain传入的对象
//如果是同一个对象的话就不需要release和retain
if(_car!=car){
[_car release];
_car=[car retain];
}
在dealloc中,release实例对象
[_car release];
7.@property参数
1.原子性atomic nonatomic
2.读写readwrite readonly
3.内存管理assign retain copy
替换get方法名称setter=isVip,get方法名称getter=isVip
8.@class的使用
使用import引入头文件时,如果头文件的内容发生了变化,此时所有引用这个头文件的类都需要重新编译
使用@class 类名;代替import
告诉编译器xxx是一个类,不需要重新编译
但是使用时会有提示错误,解决办法,在.m文件中再import一次
@class的可以解决循环引入问题,A类和B类互相import,使用class不会报错
9.循环retain会导致两个对象都会内存泄露
防止方法:1)让某个对象多释放一次(注意顺序)
2)推荐方法:一端使用assign,另一端使用retain
10.NSString对象
11.@autoRelease
如果一个方法需要放回一个新建的对象,该对象何时释放?
方法内部不会释放,因为这样做会将对象立即释放而返回一个空对象,调用者也不会主动释放该对象
这个时候就发生了内存泄露
1)@autoreleasepool {}创建自动释放池
2)[对象 autorelease];//加入自动释放池,发送消息,释放池结束的时候调用对象的release
autorelease的嵌套:
1)自动释放池的栈结构和内存的栈是不一样的
2)对象存在栈顶的自动释放池中
12.id和instancetype的区别
instancetype可以智能帮我们判断赋值的指针变量的类型和方法的返回值类型是否一致
13.autorelease的使用场景
如父类是Person在父类的person方法中使用autorelease,Student继承Person类
//
// Person.m
// OC03
//
// Created by fanyafang on 15/11/7.
// Copyright © 2015年 itcast. All rights reserved.
// #import "Person.h" @implementation Person
+(instancetype)person{
return [[[self alloc]init]autorelease];
}
-(void)dealloc{
NSLog(@"Person释放了!");
}
@end
在main方法中,创建自动释放池
#import <Foundation/Foundation.h>
#import "Student.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
//Person *p=[Person person];
Student *student = [Student person];
}
return ;
}
14.重写初始化方法
//
// Student.h
// OC03
//
// Created by fanyafang on 15/11/7.
// Copyright © 2015年 itcast. All rights reserved.
// #import <Foundation/Foundation.h> @interface Student : NSObject
@property(nonatomic,assign) int age;
-(instancetype)initWithAge:(int)age;
+(instancetype)StudentWithAge:(int)age;
@end
//
// Student.m
// OC03
//
// Created by fanyafang on 15/11/7.
// Copyright © 2015年 itcast. All rights reserved.
// #import "Student.h" @implementation Student
-(void)dealloc{
NSLog(@"释放了");
}
-(instancetype)initWithAge:(int)age{
if(self=[super init]){
_age=age;
}
return self;
}
+(instancetype)StudentWithAge:(int)age{ return [[[self alloc]initWithAge:age]autorelease];
}
@end
//
// main.m
// 重写初始化方法
//
// Created by fanyafang on 15/11/7.
// Copyright © 2015年 itcast. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Student.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
Student *stu=[[Student alloc]initWithAge:10];
NSLog(@"stu age%d",[stu age]);
[stu release];
*/
Student *stu=[Student StudentWithAge:];
NSLog(@"stu age%d",[stu age]);
}
return ;
}
Objective-C基础3的更多相关文章
- Objective—C基础学习总结
1. (1)面向过程:一种以事件为中心的编程思想 (2)面向对象:一种以对象为中心的编程思想 2.get和set是用来访问和修改对象里的属性值 ...
- Objective C 基础
1,字符串加@: 不加@的是C语言字符串. 加@的代表的是OC的NSString http://www.jikexueyuan.com/course/71_2.html 2,setValuesForK ...
- [置顶] IOS 基础入门教程
IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...
- Getting Started with Core Data
Getting Started with Core Data Getting Started with Core Data Coreframework支持创建对象模型封装你的应用数据和逻辑满足MVC设 ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective-c——UI基础开发第十二天(相册展示)
一.知识点 模仿新特性 UICollectionViewFlowLayout自定义布局 相册 瀑布流(淘宝购物之类的 二.复习 a.UICollectionView 和 tableview共享一套AP ...
- Objective-c——UI基础开发第十一天(UICollectionView)
一.知识点 1.UICollectionView的dataSource .delegate 2.UICollectionView多组数据和单组数据的展示 3.UICollectionView.UICo ...
- Objective-c——UI基础开发第十天(自动布局)
一.autoresizing 的使用(了解) 只能参照父控件 1.实现横竖屏幕切换,不能把控件的frame血丝,需要进行屏幕适配 2.需要参照父控件 use auto layout禁用 才会出现aut ...
- Objective-c——UI基础开发第九天(QQ好友列表)
一.知识点: 1.双模型的嵌套使用 2.Button的对齐方式 3.优化UITableView的加载 4.layoutSubview的使用 5.cell的折叠代理 二.双模型的嵌套定义: 注意是将se ...
- Objective-c——UI基础开发第八天(QQ聊天界面)
一.知识点: QQ聊天界面 双模型的使用(dataModel和frameModel) UITextField的使用 通知的使用 拉伸图片的两种方法(slicing/image对象的resizeable ...
随机推荐
- PHP TCPDF ERROR: [Image] Unable to get image解决办法详解
使用TCPDF输出pdf文件时,有时会直接显示pdf文件不可显示,仔细调试之下会报错TCPDF ERROR: [Image] Unable to get image.问题出现Image()函数中.第一 ...
- 害死人不偿命的(3n+1)猜想
卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...
- npm link 安装本地模块,将本地模块cli化
第三方学习地址 http://mp.weixin.qq.com/s?__biz=MzAxMTU0NTc4Nw==&mid=2661157390&idx=1&sn=6d96e54 ...
- linux常用命令(四)
1.压缩解压命令 gzip命令 默认为.gz格式文件 1.只能压缩文件不可压缩目录 2.不保留源文件 压缩 giz 解压 gunip tar命令 -c产生打包文件 -v显示相信打包压缩过程 - ...
- 【iCore3 双核心板_FPGA】实验二十六:SDRAM读写测试实验
实验指导书及代码包下载: http://pan.baidu.com/s/1c1VRibY iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- Android 操作系统的内存回收机制(转载)
Android 操作系统的内存回收机制(转载) Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对 ...
- 数据库的修改和删除;比较标签代替<,>,=号;模板替换;session的用法
注: 1.session:系统默认开启;用途:防止跳过登录(只能访问登录方法);session和cookie的用法(手册->专题); 赋值:session('name','value'); 取值 ...
- sublime sublimeCodeIntel插件 配置
安装完成后, 弹出一个说明 页面, 不用 管 .可到了这里就是没有提示信息, 忽略 配置sublimeCodeIntel的config文件,告诉他我们需要javascript的提示. 法一: 通过su ...
- node-webkit 桌面开发 初入1
node-webkit 是什么就不介绍了 注意官网的一句话 ”node-webkit is based on Chromium and node.js " 所以node-webkit 实际 ...
- phpexcel 导出 科学计数问题
今天在用php做excel导出的时候遇到了一个小问题,如图 单元格默认格式为常规格式,当数值过长时就会变成科学计数. 解决方法: 如果输出的excel的$data数据是手动添加的,那就在对应值得后面添 ...