iOS开发语言之OC 初级内存管理

本文深入解析内存管理中的关键概念,包括内存溢出、野指针访问等问题,并详细讲解了对象的创建与销毁过程,自动释放池的应用及copy方法的正确实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  出现内存问题一般有两个方面:

1.内存溢出:超出了给你限定的内存区域导致的问题(就跟用容器装水一样,超出了容器的水就会溢出)

2.野指针访问:对象的内存空间已经被系统回收,仍然使用指针操作这块内存。野指针操作是引起程序crash的主要原因。代码量越大越难找出野指针的位置

好了   下面我们来了解一下内存的管理   只有了解了内存管理才能够帮我们提升程序的性能,减少bug调试时间以及减少bug发生几率


首先   我们如何管理内存呢?

解决方案:对象有创建就要有销毁

所谓的内存管理就是对对象的创建和销毁的过程进行管理。

好了废话一大堆

  下面来点实际的   内存整理中需要注意的事项

dealloc是继承自父类(NSObject)的方法,当对象的引用计数为0时,有系统使用该对象调用dealloc方法

dealloc方法我们不要自己调用

下面是dealloc方法的调用    

先创建一个类的.m文件 在里面输入

//咱们不直接调用dealloc方法
//执行时机:当对象的retaincount0的时候,系统会自动使用对象调用dealloc这个方法
-(
void)dealloc{
   
   
NSLog(@"%@被释放了",self);
   
//调用父类的dealloc方法要放在最后写
    [
super dealloc];
}

下面还有一个问题哦
是关于
autorelease:引用计数器:未来的某一时刻-1

自动释放池
NSAutoreleasePool类
当你创建对象不想立即释放的时候可以使用autorelease,那么会把对象的所有权交给最近NSAutoreleasePool对象
autoreleasepool控制使用autorelesa对象的释放。
这个对象如何释放取决于这个autoreleasepool
 @autoreleasepool {
           
Person *person3=[[Person alloc]init];
            [person3
retain];
            [person3
autorelease];
           
NSLog(@"person3=%lu",person3.retainCount);
        }
再然后就是copy(拷贝)问题了
想要copy一个对象,也就是生成一个副本。需要先遵循NSCopying协议,NSCopying协议中有一个必须实现的协议方法,就会导致崩溃。我们需要在copyWithZone这个方法中定义copy的细节实现。
在类的.m文件中
@synthesize name=_name;
@synthesize num=_num;



//当对象执行copy方法时,会执行copyWithZone方法
-(id)copyWithZone:(NSZone *)zone{
    //创建一个新的同类型的对象
    Person *person=[Person allocWithZone:zone];
    //将被copy对象的值,赋值给新创建出来的实例对象,既完成了copy方法,
    person.name=self.name;
    person.num=self.num;
    return person;
}
最后   

@"换换"这个字符串存在常量区,常量区的东西不能被打印

        NSString *yu=@"换换";

        NSLog(@"yu=%lu",yu.retainCount);

        [yu release];

        NSLog(@"yu=%lu",yu.retainCount);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值