oc为每一个对象提供一个内部计数器。这个计数器跟踪对象的引用计数,当对象被创建或拷贝时。引用计数为1。每次保持对象时,调用retain接口。引用计数加1。假设不需要这个对象时调用release,引用计数减1,当对像的引用计数为0时,系统就会释放掉这块内存,释放对象调用dealloc

当对象包括其它对象时,就得在dealloc中自己释放他们

NSObject是IOS全部类的基类

有两个基本函数。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/retain/copy) 

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地址为0×3333,内容为3333。在栈上分配空间,地址为0X3333,内容为“hello”,新的对象retainCount为1。str对象没有变化,对newStr运行删除操作仅仅会涉及其本身,与str无关
retain:NSString *newStr=[str retain];

newStr地址为0X4444,内容为1111。str的retaincount++,

 assign就是直接赋值。删除时可能引起问题。当数据为int, float等原生类型时,能够使用assign。retain使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用。内存被回收。copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。

objective C 内存管理及属性方法具体解释的更多相关文章

  1. Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease   Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...

  2. OC:内存管理、dealloc方法、copy知识点

    属性的声明:使⽤@property声明属性
 例如:@property NSString *name: 相当于@interface中声明了两个⽅法(setter.getter): 属性的实现:使⽤@s ...

  3. iOS 内存管理之属性关键字

    你好2019!一起努力呀! 主要分三种类型: 1.原子操作相关: nonatomic.atomic nonatomic:非原子操作,对属性赋值的时候不加锁,多线程并发访问会提高访问效率 atomic: ...

  4. Objective C 内存管理[转]

    1  配对原则 alloc – release new – release retain - release copy – release 2  new和alloc-init的区别 (1)区别只在于a ...

  5. 关于内存管理/set/get方法

    MRC状态下 1 任何继承NSObject的对象,存放于堆控件中,都需要手动管理内存 .2 基本数据类型放到栈中,对象放到堆空间中,内存是有系统管理的.(int\float\enum\struct) ...

  6. Oracle 自己主动内存管理 SGA、PGA 具体解释

    ASMM自己主动共享内存管理: 自己主动依据工作量变化调整 最大程度地提高内存利用率 有助于消除内存不足的错误 SYS@PROD>show parameter sga NAME          ...

  7. iOS 非ARC基本内存管理系列 5-autorelease方法使用总结

    autorelase:可以将对象交给自动释放池中,释放池销毁的时候对里面的对象做一次release操作代码如下 @autoreleasepool { Person *person = [[[Perso ...

  8. Objective-C 内存管理之dealloc方法中变量释放处理

    本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101ds8j.html   (一).关于nil http://cocoadevcentral.com/d/ ...

  9. 内存管理2(主讲MRR)

    内存管理2 我们讨论过properties 后,所有的内存管理系统都是通过控制所有对象的生命周期来减少内存的占用.iOS和OS X应用程序完成这些是通过对象拥有者来实现的,它保证了只要对象使用就会存在 ...

随机推荐

  1. 洛谷P1033 自由落体

    P1033 自由落体 题目描述 在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1.在地面上有一个小车(长为 L,高为 K,距原点距离为 S1).已知小球下落距离计算公 ...

  2. 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)

    Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...

  3. tomcat与jetty接收请求参数的区别

    [场景] 服务端点对点通知.A服务发起请求B服务,B同步返回接收成功:然后B开始处理逻辑:B处理完成后异步通知给A:A接收请求并处理,同步回写响应给B:完成. [先上代码] 服务端(接收端)代码: i ...

  4. 关于在SSM框架下使用PageHelper

    首先,如果各位在这块配置和代码有什么问题欢迎说出来,我也会尽自己最大的能力帮大家解答 这些代码我都是写在一个小项目里的,项目的github地址为:https://github.com/Albert-B ...

  5. luoguP4389 付公主的背包

    luogu 显然这是个背包题 显然物品的数量是不用管的 所以考虑大小为\(v\)的物品可以装的体积用生成函数表示一下 \[ f(x)=\sum_{i=0}^{+\infty}x^{vi}=\frac{ ...

  6. maven项目打包分析及打包后war包缺少配置文件报错的原因分析,使用progard混淆时配置分析

    1.maven打包: 一直以来我都没太注意过在myeclipse下使用run as来clean居然对项目的target目录没有进行操作,要让操作有效,需要进入到maven build...选项下,进行 ...

  7. 查询时根据权限更改sql

    import java.lang.reflect.Method; import org.apache.log4j.Logger; import org.springframework.aop.Meth ...

  8. ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall

    题目链接:https://nanti.jisuanke.com/t/30991 2000ms 262144K   Feeling hungry, a cute hamster decides to o ...

  9. HTTPS和SSL证书

    1. HTTPS工作原理 HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,(目的是安全的获得对称密钥用户后续传输加密)过程的简单描述如下: a).浏览器讲自己支持的多个加 ...

  10. 你还在为UiPath课程考试发愁吗?

    刚开始学UiPath的时候,课程的考试难倒了很多人,有语言的原因也有对课程理解的原因,记忆中好像有一课考了5次估计,由于题库也就那么多,只要你努力考,总会过的. 学会了RPA的自动化工具,能否自动化答 ...