最近对内存管理,有了一些新的认识,以前只知道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; }
这个时候,我们有点人会想到,属性在实现的时候已经释放了,其实没有实现,具体代码如下:
- (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]; }
if (_subject != subject)的意思就是,当前创建的对象,跟之前创建的对象不同,我们就要先释放之前的对象,然后再创建一个对象retain,或者copy,才行,所以会这么内部实现,保护内存.
所以,说明了我们管理内存,内部也有实现内存的黄金法则.
原文地址:http://blog.csdn.net/zuoyou1314/article/details/36653701