OC中属性的内存管理

在MRC模式下,我们建一个Person类的对象.h文件如下

 1 #import <Foundation/Foundation.h>
 2
 3 @interface Person : NSObject
 4 @property (nonatomic, retain)NSString *name;
 5 @property (nonatomic, retain)NSString *sex;
 6 @property (nonatomic, assign)NSInteger age;
 7 //自定义初始化
 8 -(instancetype)initWithName:(NSString *)name Sex:(NSString *)sex Age:(NSInteger)age;
 9 //便利构造器
10
11 +(instancetype)personWithName:(NSString *)name Sex:(NSString *)sex Age:(NSInteger)age;
12
13 @end

.m文件如下

#import "Person.h"

@implementation Person
//在MRC下,如果需要同时重写setter和getter方法,必须下面的的语句
@synthesize name = _name;
//自定义初始化
-(instancetype)initWithName:(NSString *)name Sex:(NSString *)sex Age:(NSInteger)age
{
    if (self = [super init]) {
        _name = name;
        _sex = sex;
        _age = age;
    }
    return self;
}
//便利构造器

+(instancetype)personWithName:(NSString *)name Sex:(NSString *)sex Age:(NSInteger)age
{
    return [[[Person alloc] initWithName:name Sex:sex Age:age]autorelease];
}
//重写dealloc可以验证对象内存空间是否被收回,方式是否被调用
-(void)dealloc
{
    NSLog(@"这个对象被销毁");
    //以后只要在MRC中,重写dealloc方法,就需要一一对应为语义特征为retain或者copy的属性生成的实例变量release一次
    [self.name release];//针对sertter方法最后一次retain的release
    [_sex release];
    [super dealloc];
}
//MRC下,retain的内部实现 setter方法
//-(void)setName:(NSString *)name
//{
//    if (_name != name) {
//        [_name release];
//        _name = [name retain];
//    }
//}
//-(NSString *)name
//{
//    return [[_name retain]autorelease];
//}
-(void)setName:(NSString *)name
{
    if (_name != name) {
        [_name release];
        _name = [name copy];

    }
}
-(NSString *)name
{
    return [[_name retain]autorelease];
}
@end

在MRC模式下,copy与retain的setter,getter方法写法一致,但是实现的机制不相同,前者是得到传入参数的副本,重新开辟空间,而后者是使引用计数加一

时间: 2025-01-05 17:34:48

OC中属性的内存管理的相关文章

属性与内存管理(属性与内存管理都是相互关联的)

<span style="font-size:18px;"> 属性与内存管理(属性与内存管理都是相互关联的)第一部分 一,属性: 属性是OC2.0之后出来的新语法,用来代替setter和getter方法,使用属性可以快速创建setter以及getter方法的声明,setter和getter方法的实现,另外添加了对实例变量操作的安全处理(其安全是通过内存管理实现的) setter 方法作用:为单一的实例变量重新赋值, 规范: (- 号方法)无返回值, 名字以set开头后面加上

OC基础 05-手动内存管理(MRC)

---恢复内容开始--- MRC: Manul(手动) Reference(引用) Counting(计数) 什么是手动引用计数? 所有对象的内容都需要我们手动管理, 需要程序员自己编写release/retain等代码 内存管理的原则就是有加就有减 也就是说, 一次alloc/new/copy对应一次release, 一次retain对应一次relese 内存管理的重要性: 移动设备的内存极其有限,每个app的占用内存也是有限制的. 当我们创建一个OC对象,定义一个变量,调用一个函数或者方法,

39-oc集合中对象的内存管理

集合中对象的内存管理 集合的内存管理原则是什么 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+1 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1 当一个对象从集合中移除时,会对这个对象做一次release操作,计数器会-1 集合方法的普遍规律是什么 如果方法名是add\insert开头,那么被添加的对象,计数器会+1 如果方法名是remove\delete开头,那么被移除的对象,计数器-1

c++中的动态内存管理

c++中的动态内存管理问题 c++中使用new和delete实现动态内存管理.new和delete实现动态管理对象,new[]和delete[]实现动态管理对象数组.c++中的new和delete运算符均使用我们c中学过的malloc和delete函数实现动态内存的开辟. 首先,先简单介绍下c中的几个动态内存函数malloc,realloc,calloc,free; void *malloc(size_t size); //动态内存开辟函数 void free(void *pointer);  

OC中如何对内存进行管理的

OC中的内存管理主要由三种方式ARC(自动内存计数),手动内存计数,内存池: 1)ARC:这种方式和java类似,在你的程序的执行中,始终有一个高人在你背后准确的帮你收拾垃圾,你不用考虑它什么时候开始工作,怎么样工作,你只需明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就会彻底把它忘掉了,反正那个高人会帮我们收拾垃圾的,但遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品,所以iPhone不支持这个功能. 解决:通过alloc-inital方式创建的,创

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

【OC基础】03-OC内存管理

概述 跟Java和C#类似,OC创建的对象在堆上.与Java和C#不同的是Java和C#有垃圾回收机制,所以不需要程序员手动释放堆上的内存.而OC没有垃圾回收机制,必须手动管理内存的创建和释放.下面介绍一下OC内存管理内存管理的方式. 引用计数器 OC管理内存的方式类似C++中的智能指针,创建一个对象时,在ObjC中每个对象内部都有一个与之对应的整数(retainCount),叫“引用计数器”,当一个对象在创建之后初始化它的引用计数器为1,当调用这个对象的alloc.retain.new.cop

OC学习篇之---内存管理介绍和使用

在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中最难的一部分内容:内存管理 为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Android运行速度上会慢一下,原因很简单,Java的垃圾回收器有很多收集算法的,这个在回收的过程中是很浪费时间的

OC加强(一)之内存管理

1.为什么要进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存 较多时,系统就会发出内存警告,一个app可用的内存是被限制的,如果一个app使用的内存超 过20M,则系统会向该app发送Memory Warning消息.收到此消息后,需要回收一些不需要再 继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会崩溃. 这里首先要解释一个常识概念:内存,存储空间,各自的功能? 内存:我们一般说的手机内存其实是指运行内存,,简称运存,即