objective c内存管理

一、手动内存管理
1、引用计数器
(1)每个OC对象都有自己的引用计数器,是一个整数,表示“该对象被引用的次数”,即有多少人正在引用该OC对象,引用计数器占用4个字节的空间。
(2)引用计数器的作用
a、当使用alloc、new或者copy创建一个新对象时,新对象的引用计数器默认就是1
b、当一个对象的引用计数器值为0时,对象占用的内存就会被系统回收。换句话说,如果对象的计数器不为0,那么在整个程序运行过程,它占用的内存就不可能被回收,除非整个程序已经退出
(3)引用计数器的操作
a、给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回对象本身)
b、给对象发送一条release消息,可以使引用计数器值-1
c、可以给对象发送retainCount消息获得当前的引用计数器值
2、对象的销毁
a、当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收
b、当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
c、一般会重写dealloc方法,在这里释放相关资源,dealloc就像对象的遗言
d、一旦重写了dealloc方法,就必须调用[super dealloc],并且放在最后面调用
e、不要直接调用dealloc方法
f、一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)
3、概念
a、僵尸对象:所占用空间已经被回收的对象,僵尸对象不能再使用
b、野指针:指向僵尸对象(不可用内存)的指针
c、空指针:没有指向任何东西的指针(0或nil),给空指针发送消息不会报错
4、原则
a、谁创建,谁就release;如果你通过alloc、new或[mutable]copy来创建一个对象,那么你必须调用release或autorelease
b、谁retain,谁就release;只要你调用了retain,无论这个对象是如何生成的,你都要调用release

4、每个OC对象都有一个“引用计数器”,(它占用四个字)节,OC对象刚创建后引用计数的初始值为1,当该值为0的时候,他就会被回收,并且回收前向对象发送dealloc消息,如果重写delloc方法一定要调用super dealloc而且这句调用要放最后。

5、每当alloc或者retain一个对象的时候一定要进行release调用,不然会出现内存泄露。当应用计数为0时在进行release调用就会出现野指针错误,所以当引用计数为0的时候最好要对对象赋值为nil(为空指针发送消息不会出现错误)。

6、Set方法管理的最严谨的写法

<span style="font-size:18px;">- (void)SetCar:(Car *)car  
{  
    if(_car != car)  //判断是不是新传进来新对象  
    {  
        [_car release];  // 如果是,对旧对象进行一次release  
        _car = [car retain];    // 对新对象进行retain,同时将新车变旧车  
        
    }  
}</span>
7、@property 相当于将第6条的写法进行简化,但其实本质还是编译器自动生成第6条的写法

@property (XXX) Car *car;
XXX=retain:    release旧值,retain新值(适用于OC对象类型,跟第3条手动写法一样)
XXX=assign:  直接赋值(默认,适用于非OC对象类型比如基本数据类型int)
XXX=copy:     release旧值,copy新值(NSString使用copy)。

XXX=readwrite:默认。同时生成setter和getter
XXX=readonly:只会生成getter的声明和实现。


@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么默认的就是@syntheszie car= _car

@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic car,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.car =someCar,由于缺setter方法会导致程序崩溃;或者当运行到 someCar = car时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。
如果使用@property和@synthesize而省略了对于成员变量的声明,则自动生成的成员变量为@private私有的。

如果类的实现中已经存在了对于的setter方法、getter方法,则@property和@synthesize不会覆盖,而是使用自定义的setter方法、getter方法。
点语法陷阱:
1)OC中有个self关键字,作用跟this关键字类似。我这么说完,可能有人就会想这样写OC的set方法了
-(void)setAge:(int)newAge {
self.age= newAge;
}
这绝对是错误的,会造成死循环。因为我在前面已经说过了,OC点语法的本质是方法调用,所以上面的代码相当于
-(void)setAge:(int)newAge {
[selfsetAge:newAge];
}
下面的使用方式也是一个死循环:
2)在get方法中,return self.age;相当于是[self age];

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值