objective C 内存管理及属性方法具体解释
oc为每一个对象提供一个内部计数器。这个计数器跟踪对象的引用计数,当对象被创建或拷贝时。引用计数为1。每次保持对象时,调用retain接口。引用计数加1。假设不需要这个对象时调用release,引用计数减1,当对像的引用计数为0时,系统就会释放掉这块内存,释放对象调用dealloc
当对象包括其它对象时,就得在dealloc中自己释放他们
有两个基本函数。alloc和dealloc
alloc相似于C++的new。dealloc相似于delete
当对象的retaincount为0时。自己主动调用dealloc函数
release仅仅是使retaincount-1。不是调用dealloc函数
内存管理的原则:
假设使用alloc。copy创建的对象。一定要release
假设你retain一个对象,那么必需要release
Song 类的实现
#import <Foundation/Foundation.h>
@interface Song : NSObject
{
NSString *_title;
NSString *_artist;
long int _duration;
}
@property (nonatomic,retain) NSString *title;
@property (nonatomic,retain) NSString *artist;
@property (nonatomic,assign) long int duration;
-(Song*)initwithTitle:(NSString *)t AndArtist:(NSString *)art AndDuration:(long int)d;
@end
#import "Song.h"
@implementation Song
@synthesize title=_title;
@synthesize artist=_artist;
@synthesize duration=_duration;
-(Song*)initwithTitle:(NSString *)t AndArtist:(NSString *)art AndDuration:(long)d
{
self=[super init];
if(self)
{
self.title=t;
self.artist=art;
self.duration=d;
}
return self;
}
@end
main函数code
int main(int argc, const char * argv[])
{
Song *Song1=[[Song alloc] initwithTitle:@"what" AndArtist:@"hello" AndDuration:3];
Song *Song2=[[Song alloc] initwithTitle:@"aaa" AndArtist:@"bbb" AndDuration:4];
NSLog(@"Song1 retain count is %ld",[Song1 retainCount]);
NSLog(@"Song2 retain count is %ld",[Song2 retainCount]);
[Song1 retain];
[Song2 retain];
NSLog(@"Song1 retain count is %ld",[Song1 retainCount]);
NSLog(@"Song2 retain count is %ld",[Song2 retainCount]);
[Song1 release];
[Song2 release];
NSLog(@"Song1 retain count is %ld",[Song1 retainCount]);
NSLog(@"Song2 retain count is %ld",[Song2 retainCount]);
[Song1 release];
[Song2 release];
return 0;
}
the result:
2013-05-07 14:44:55.170 Access[2891:303] Song1 retain count is 1
2013-05-07 14:44:55.173 Access[2891:303] Song2 retain count is 1
2013-05-07 14:44:55.173 Access[2891:303] Song1 retain count is 2
2013-05-07 14:44:55.173 Access[2891:303] Song2 retain count is 2
2013-05-07 14:44:55.174 Access[2891:303] Song1 retain count is 1
2013-05-07 14:44:55.174 Access[2891:303] Song2 retain count is 1
内存管理释放池提供了一个对象容器。每次对象发送autorelease时。对象的引用计数并不真正变化。而是内存释放池记录一条记录,记下该对象的要求,直到内存释放池发送retain或release时,当池在销毁之前通知池内全部元素,发送release消息减1。这部分代码必须放在:
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
和 [pool release]; 之间
int main(int argc, const char * argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
NSArray *weeks1=[NSArray arrayWithObjects:@"monday",@"tuesday",@"thursday", nil];
NSArray *weeks2=[[NSArray alloc ]initWithObjects:@"monday",@"tuesday",@"thursday", nil];
//[weeks1 autorelease];
[weeks1 release];
[weeks2 release];
//[weeks2 autorelease];
NSLog(@"retain count is %ld",[weeks1 retainCount]);
NSLog(@"retain count is %ld",[weeks2 retainCount]);
[pool release];
return 0;
}
属性简单介绍
@property 和@synthesize 能够自己主动生成某个类成员变量的存取方法,
语法 @property(參数) 类型 名字
这里的參数分为三大类:
读写属性:(readwrite/readonly) readwrite:这个属性是默认的,readonly:仅仅生成getter 不会有setter
原子性(nonatomic)atomic ;是为了保证程序能够并发,避免同步问题
assign:这个属性用来处理基础类型,比方int,float。假设你声明的类型就是基础类型,该属性能够不加
对于assign而言。set函数和get函数例如以下所看到的:
@property(nonatomic,assign)int val;
-(int)val
{
return val;
}
(void)setVal:(int)newVal
{
val=newVal;
}
copy:自己主动生成该对象的克隆
代码例如以下:
@property (nonatomic,copy) NSString *title;
-(NSString*)title
{
return title;
}
-(void)settitle:(NSString*)newtitile
{
//首先推断是否与旧对象一致,假设不一致进行赋值。
if(newTitle!=title)
{
[title release];
title=[newtitile copy];
}
}
retain:会自己主动retain对象。实现
代码例如以下:
@property (nonatomic,retain) NSString *title;
-(NSString*)title
{
return title;
}
-(void)settitle:(NSString*)newtitile
{
//首先推断是否与旧对象一致。假设不一致进行赋值。
//对于nil对象运行release,不会抛异常,假设不会nil,release正好释放旧的对象,这样就能够保证不会出现内存泄露
//由于假设是一个对象的话。进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放。而达不到赋值目的。
if(newTitle!=title)
{
[title release];
title=[newtitile retain];
}
}
在对属性进行赋值时,会调用属性的set方法,使引用计数加一从而保证内存的正确引用。
自己定义的类是不能用COPY的,由于自己定义的类没有实现<NSCopy>协议,该协议里面有各种copy方法,所以,copy别乱用,尽量仅仅在设置字符串时使用。
assign,retain 和 copy的差别
- copy: 建立一个索引计数为1的对象,然后释放旧对象
- retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
- assign:直接复制。并未创建新的对象
比方一个NSString对象。NSString *str=【NSString alloc】initwithString:@"hello";
在内存分配的步骤例如以下:
首先,在堆上创建一块内存,内容初始化为“hello”,地址为0X1111
其次,在栈上创建一内存,地址为0X2222,内容为1111,
assign : NSString *newStr=[str assign];
则newStr是str的别名。地址为0X2222,内容为1111,retaincount值不变,对newStr运行删除操作,则str也会被删除
copy:NSString *newStr=[str copy];
newStr地址为0X4444,内容为1111。str的retaincount++,
assign就是直接赋值。删除时可能引起问题。当数据为int, float等原生类型时,能够使用assign。retain使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用。内存被回收。copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。
objective C 内存管理及属性方法具体解释的更多相关文章
- Objective C内存管理之理解autorelease------面试题
Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...
- OC:内存管理、dealloc方法、copy知识点
属性的声明:使⽤@property声明属性 例如:@property NSString *name: 相当于@interface中声明了两个⽅法(setter.getter): 属性的实现:使⽤@s ...
- iOS 内存管理之属性关键字
你好2019!一起努力呀! 主要分三种类型: 1.原子操作相关: nonatomic.atomic nonatomic:非原子操作,对属性赋值的时候不加锁,多线程并发访问会提高访问效率 atomic: ...
- Objective C 内存管理[转]
1 配对原则 alloc – release new – release retain - release copy – release 2 new和alloc-init的区别 (1)区别只在于a ...
- 关于内存管理/set/get方法
MRC状态下 1 任何继承NSObject的对象,存放于堆控件中,都需要手动管理内存 .2 基本数据类型放到栈中,对象放到堆空间中,内存是有系统管理的.(int\float\enum\struct) ...
- Oracle 自己主动内存管理 SGA、PGA 具体解释
ASMM自己主动共享内存管理: 自己主动依据工作量变化调整 最大程度地提高内存利用率 有助于消除内存不足的错误 SYS@PROD>show parameter sga NAME ...
- iOS 非ARC基本内存管理系列 5-autorelease方法使用总结
autorelase:可以将对象交给自动释放池中,释放池销毁的时候对里面的对象做一次release操作代码如下 @autoreleasepool { Person *person = [[[Perso ...
- Objective-C 内存管理之dealloc方法中变量释放处理
本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101ds8j.html (一).关于nil http://cocoadevcentral.com/d/ ...
- 内存管理2(主讲MRR)
内存管理2 我们讨论过properties 后,所有的内存管理系统都是通过控制所有对象的生命周期来减少内存的占用.iOS和OS X应用程序完成这些是通过对象拥有者来实现的,它保证了只要对象使用就会存在 ...
随机推荐
- SQL Server 2012安装——.net framework 3.5离线安装
前言 电脑用着一直很不舒服,所以就决定对电脑重新配置一番,在装数据库这里,可谓是屡装屡败.自己感觉太麻烦了,于是每次数据库装失败后,就重装系统,然后配置上网文档,这样一来,弄得自己挺恶心,这次很明显成 ...
- 解读人:刘佳维,Spectral Clustering Improves Label-Free Quantification of Low-Abundant Proteins(谱图聚类改善了低丰度蛋白的无标记定量)
发表时间:(2019年4月) IF:3.95 单位: 维也纳医科大学: 欧洲生物信息研究所(EMBL-EBI): 分子病理学研究所: 奥地利科学院分子生物技术研究所: Gregor Mendel分子植 ...
- Tomcat热部署的实现原理
Tomcat热部署机制 对于Java应用程序来说,热部署就是在运行时更新Java类文件.在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色.大多数基于Java的应用服务器,包括EJ ...
- B.Grid with Arrows-The 2019 ICPC China Shaanxi Provincial Programming Contest
BaoBao has just found a grid with $n$ rows and $m$ columns in his left pocket, where the cell in the ...
- Sharepoint JSCOM 列表操作
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', retrieveListItemsInclude); //确保js文件加载,再执行方法 function ...
- CBV 与 FBV
FBV:function based view 视图函数,是指之前用的 views.py 中基于函数的开发,url 都是通过函数来实现的,每个 url 对应的函数之间都是独立的. 直接在views.p ...
- sql 更新 批量更新 更新得到主键
import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.jdbc.c ...
- LeetCode 225 Implement Stack using Queues 用队列实现栈
1.两个队列实现,始终保持一个队列为空即可 class MyStack { public: /** Initialize your data structure here. */ MyStack() ...
- notepad++的tab设置为4个空格
设置--首选项--语言--制表符设置--(勾选上)替换为空格
- 宋宝华:swappiness=0究竟意味着什么?
http://mp.weixin.qq.com/s/BixMISiPz3sR9FDNfVSJ6w 本文解释swappiness的作用,以及swappiness=0究竟意味着什么. 内存回收 我们都知道 ...