最近对内存管理,有了一些新的认识,以前只知道alloc,或者retain,或者copy,之后需要release或者autorelease;
只知其一,但是在工作学习中仅仅知道这些是不够用的,还需要知道属性等内部的内存存管理才行.
@property (readwrite,nonatomic,assign)NSInteger age;
@property (readwrite,nonatomic,copy)NSString * name;
@property (readwrite,nonatomic,retain)NSString * sex;
@property (readwrite,nonatomic,copy)NSString * subject;
在定义属性了之后,需要首先使用dealloc.如下:
- (void)dealloc
{
[_name release] , _name = nil;
[_subject release],_subject = nil;
[_sex release],_sex = nil;
[super dealloc];
}
这个时候,我们会问,为啥要写dealloc以前我真的不知道,后来通过了解内存的黄金管理法则,我总算明白了,主要原因如下:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Person * zhangsan = [[Person alloc]init];
[zhangsan setName:@"张三"];
zhangsan.age=24;
zhangsan.sex = @"男";
[zhangsan print];
[zhangsan release];
return 0;
}
当我们释放了person的对象zhangsan的时候,我们内部赋值使用的属性,还存在内存中,,如果不释放,很有可能会造成内存泄露.所以需要dealloc.
这个时候,我们有点人会想到,属性在实现的时候已经释放了,其实没有实现,具体代码如下:
- (void)setSex:(NSString *)sex
{
if (_sex != sex) {
[_sex release];
_sex =[sex retain];
}
}
- (NSString *)sex
{
return [[_sex retain]autorelease];
}
- (void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name =[name copy];
}
}
- ( NSString *)name
{
return [[_name retain]autorelease];
}
- (void)setSubject:(NSString *)subject
{
if (_subject != subject) {
[_subject release];
_subject = [subject copy];
}
}
- (NSString *)subject
{
return [[_subject retain]autorelease];
}
这里的release的目的,主要是我们在赋值取值的时候,有可能会多次使用,这个时候
if (_subject != subject)的意思就是,当前创建的对象,跟之前创建的对象不同,我们就要先释放之前的对象,然后再创建一个对象retain,或者copy,才行,所以会这么内部实现,保护内存.
所以,说明了我们管理内存,内部也有实现内存的黄金法则.