您的位置:首页 > 移动开发 > IOS开发

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

2015-11-13 17:59 197 查看
  出现内存问题一般有两个方面:

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

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

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

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

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

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

好了废话一大堆

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

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

dealloc方法我们不要自己调用

下面是dealloc方法的调用    

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

//咱们不直接调用dealloc方法
//执行时机:当对象的retaincount为0的时候,系统会自动使用对象调用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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息