oc知识点 内存高级

news/2024/7/20 12:56:33 标签: 内存管理

一属性的内存管理

1属性的语义特征

①assign 基本数据类型(char,short,int,float,double)

<1>最开始使用的set get方法的实现

@property (nonatomic, assign) NSIntger age;
set
     - (void)setName:(NSIntger)age {
       _age = age;
}
get - (NSIntger)age { return _age; }

<2>修改后的代码

set
- (void)setName:(NSIntger)age {
   _age = age;
}
get
- (void)setName:(NSIntger)age { [_age release]; _age = [age retion];

 

②retain 对象类型

@property (nonatomic, retain) NSString *name;
set
     - (void)setName:(NSString *)name {
         if (_name != name) {
             [_name release];
             _name = [name retain];
         }
}
get
     - (NSString *)name {
         return [[_name retain] autorelease];
}

 

③copy 对象类型,且遵循了<NSCopying>协议的

@property (nonatomic, copy) NSString *name; 
set
    - (void)setName:(NSString *)name {
        if (_name != name) {
            [_name release];
            _name = [name copy];
        }
}
get
    - (NSString *)name {
        return [[_name retain] autorelease];
}

如果要对一个对象进⾏行copy操作,那该对象所属的类必 须遵守<NSCopying>协议

二dealloc释放那个实例变量

1dealloc是NSObject的一个实力方法,用于回收alloc开辟的内存空间

2这个方法在对象引用计数为0时,由系统自动调用

3通常我们在dealloc中释放类的实例变量

修改前
(void)dealloc { [super dealloc]; }
修改后
- (void)dealloc { [_name release]; [super dealloc

注意  永远不要手动调用dealloc

     在dealloc方法的最后一行必须要写【super dealloc】,让系统真正去销毁对象

三便利构造器的内存管理

+ (id)personWithName:(NSString *)name {
    Person *p = [[Person alloc] initWithName:name];
    return p;
}

现在考虑p该如何释放?

+ (id)personWithName:(NSString *)name {
Person *p = [[Person alloc] initWithName:name]; r[epturn [p autorelease];
} [p }

四集合的内存管理

1常见集合 NSArray NSDictionary ,NSSet

2集合会自主管理集合内部的元素

  集合内存的管理方式:

   ①加入集合的元素会被retain

   ②移除集合的元素会被release

  ③集合被释放时会堆积和中所有元素release;

五KVC

1 kvc ;key Value Coding 键值编码 ,是一种间接访问器方法

2KVC 中常见的方法:

- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValuesForKeysWithDictionary:(NSDictionary
*)keyedValues

虽然提供了这些方法但是对于想获取信息的时候也可以直接使用get方法

注意:当使用KVC时,如果key值和属性名不一样时就会放生程序运行崩溃

//如果是用kvc赋值,一定要重写这个方法,这个方法可以什么都不写,作用防止找不到key而崩溃

-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    //NSLog(@"++=%@:%@",key,value);
}

或者

- (id)valueForUndefinedKey:(NSString *)key {
}

六ARC

1ARC 自动引用计数,由开发者开辟内存空间,但事实不需要释放内存空间,由系统自动释放空间

2ARC本质还是基于MRC的,只不过是系统自动添加了释放内存的方法

3ARC 是编译器特性,而不是运行时特性,更不是垃圾回收器

 

ARC的注意事项

1当工程开启ARC后由于编译器会自动帮你释放内存,所以和内存有关的操作retain release autorelease 都不能写

2当重写dealloc方法时 也不能写【super dealloc】,否则会报错

 

语意特性

① assign 基本数据类型

② strong 对象类型,相当于MRC中的retain

③ copy 对象类型 ,且遵守了<NSCopying>协议

④ weak 对象类型 ,但是内部不会对对象做retain的操作

 

ARC 与MRC的混编

如果需要对特定⽂文件开启或关闭ARC,可以在⼯工程选项中选择

Targets -> Compile Phases -> Compile Sources,在⾥里⾯面找到对应⽂文 件,添加flag:

打开ARC:-fobjc-arc 关闭ARC:-fno-objc-arc

 

转载于:https://www.cnblogs.com/yuboke/p/5232359.html


http://www.niftyadmin.cn/n/982896.html

相关文章

【大数据安全】基于Kerberos的大数据安全验证方案

1.背景 互联网从来就不是一个安全的地方。很多时候我们过分依赖防火墙来解决安全的问题&#xff0c;不幸的是&#xff0c;防火墙是假设“坏人”是来自外部的&#xff0c;而真正具有破坏性的攻击事件都是往往都是来自于内部的。 近几年&#xff0c;在thehackernews等网站上总会…

Python + Elasticsearch。 第一步。

Lately, here at Tryolabs, we started gaining interest in big data and search related platforms which are giving us excellent resources to create our complex web applications. One of them is Elasticsearch. 最近&#xff0c;在Tryolabs&#xff0c;我们开始对大数…

TDengine3.0 新架构设计思路

在 8 月 13 日的 TDengine 开发者大会上&#xff0c;TDengine 分布式系统架构师关胜亮带来题为《支持 10 亿时间线、100 个节点的 TDengine 分布式系统架构设计》的主题演讲&#xff0c;详细阐述了 TDengine 3.0 新的架构设计思路。本文根据此演讲整理而成。 在物联网大数据时代…

KickStart安装CentOS,同时安装和配置hadoop

声明&#xff1a;这篇文章是前面是拾人牙慧&#xff0c;我是结合 http://www.111cn.net/sys/linux/59969.htm 和 http://www.cnblogs.com/mchina/p/centos-pxe-kickstart-auto-install-os.html 两篇博客写的。 后面关于IP的部分是自己的 一&#xff1a;系统环境 实验平台&#…

明势资本黄明明:创新与世界,下一代基础软件的中国突围之路

T 导读&#xff1a;8 月 13 日&#xff0c;涛思数据举行了成立 5 年来的第一次 TDengine 开发者大会&#xff0c;重磅发布了 TDengine 3.0&#xff0c;一款真正云原生的时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;。 明势资本是涛思数据最早的投资…

淘宝联盟超级搜索接口_超级:联盟国

淘宝联盟超级搜索接口It’s been a few months since I last spoke about hyper. The reason I’ve been so quiet is primarily because not much progress has been made on the project. I’ve been swamped with other projects (most notably Project Calico), and that’…

TDengine 3.0 存储引擎升级之路

在 8 月 13 日的 TDengine 开发者大会上&#xff0c;TDengine 存储引擎架构师程洪泽带来题为《TDengine 的存储引擎升级之路——从 1.0 到 3.0》的主题演讲&#xff0c;详细阐述了 TDengine 3.0 存储引擎的技术优化与升级。本文根据此演讲整理而成。 相比前两个版本&#xff0c…

css3学习

1.box-shadow: h-shadow v-shadow blur spread color inset; 2.CSS3圆角只需设置一个属性&#xff1a;border-radius&#xff08;含义是"边框半径"&#xff09;。你为这个属性提供一个值&#xff0c;就能同时设置四个圆角的半径。所有合法的CSS度量值都可以使用&…