iOS内存管理学习笔记二
继续学习内存管理相关知识。
1、小小知识点
1>有关OC内存管理的方法并不包括在该语言中,而是包含在cocoa框架中,用于OS X,iOS的开发。
2>cocoa框架中foundation框架类库中的NSObject类负责内存管理的职责。
3>NSObject类的相关方法:
- (instancetype)alloc ------创建
- (instancetype)retain ------引用计数增加
- (oneway void)release ------引用计数减少
-
(void)dealloc
用图形表示如下:
image.png
4>使用以下方法自己生成的对象,自己持有
+alloc
+new
+copy
+mutableCopy
例如:
NSObject * obj =[ [NSObject alloc]init];
使用alloc方法生成对象,并把指向该对象的指针赋值给了obj这个变量,现在这个对象的retainCount值等于1。
另外,使用new方法生成对象基本等同于[ [NSObject alloc]init]。
即:[NSObject new] --------- [[NSObject alloc]init];
题外话:[NSObject new]和 [[NSObject alloc]init]到底有什么区别呢?
我一直不相信他们没有任何区别,如果真是没有任何区别又为什么要写两个方法呢?
new方法的源码:
+new { id newObject = (*_alloc)((Class)self, 0); Class metaClass = self->isa; if (class_getVersion(metaClass) > 1) return [newObject init]; else return newObject; }
而 alloc/init 像这样
+alloc { return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); } -init { return self; }
概括来说,new和alloc/init在功能上几乎是一致的,分配内存并完成初始化。
差别在于,采用new的方式只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法。
5>非自己生成的对象,自己也能持有
id obj = [NSArray array];
obj可以取得对象的存在,但是并不持有该对象。
如果想持有该对象,需要主动调用retain方法,即:
[obj retain];
这样obj就持有了该对象。
6>自己持有的对象,如果不在需要了,就需要释放该对象,释放对象使用release方法。
//生成并持有该对象 id obj = [[NSObject alloc]init]; //释放该对象 [obj release];
//非自己生成对象 id obj = [NSArray array]; //持有对象 [obj retain]; //释放对象 [obj release];
注意:已经释放的对象是不可以再次访问的,如果访问了已经被释放的对象,就会造成崩溃。(wow,好可怕,但是一定遇见过)。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
谷歌 Android 应用换新装 小颜色大学问
自从App应用诞生至今,人们似乎一直将关注点放在了App本身,而鲜有人会仔细留意一款 App图标的设计风格。4月15日,多家外媒报道称,向来不大注重外形设计的谷歌,或将对自己的应用图标进行一番“重塑”,在即将召开的谷歌I/O开发者 大会上,有一批新图标即将给用户带来一种全新的体验。 据 了解,此次更新的Android图标风格简称为“Moonshine(月光式)”,跟现在的网页版应用图标颇为相像。以Gmail为例,如下图所示,网页 版Gmail的图标是一个封起来的扁平信封,而Android版的Gmail图标就比较立体:一个半开启的信封里露出一张写着“M”的信纸(左边为网络 版,中间位现行Android版,右边为即将推出的改良版)。 尽 管此前有人认为,不同平台有必要采用不同风格的图标风格,但根据此番透露出的内部消息来看,谷歌似乎正计划将网络版的设计风格带入到自己的Android 应用中:加长的扁平设计风格,对图标核心元素添加了浓重的阴影,整体看上去更加稳重、大方。与此同时,包括Play Music、Books、Movies、Google+在内的多款图标也变了样子,连Play Store中...
- 下一篇
IFTTT 加入开源大家庭,已开源5个项目
IFTTT 刚刚开源了 5个项目,存放在 GitHub 上,这些项目可以被任何人用来集成 IFTTT 的自动化到他们的 apps 和服务上。 上周,微软和谷歌宣布 办公软件在 IFTTT 得到支持,而这次 IFTTT 开源5个项目,让我们看得这些福利扩大到更多的 apps 和服务上。这 5个开源项目是: JazzHands (Objective-C) -- 一个简单的基于关键帧的动画框架,用于 UIKit 。 RazzleDazzle (Swift) -- 一个简单的基于关键帧的动画框架,用于 UIKit,用 Swift 写的。 Kashmir (Ruby) -- 一个 Ruby DSL,轻松搞定缓存和序列化。 FASTTTcamera (Objective-C) -- 一个快速和易用的 iOS 相机框架,带可定制的滤镜。 Jot (Objective-C) -- 一个 iOS 框架,轻松添加图形和文字到图像中。 虽然目前只开源了5个项目,但更多的可期矣 。 文章转载自 开源中国社区 [http://www.oschina.net]
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6