内存管理和属性

.....内存管理不是一个简单的问题,ios平台的开发者,多数为内存的问题而苦恼,内存莫名的增长,程序莫名的crash,难以发现的内存泄露,这些都是内存相关的问题,但是只要我们遵守内存管理规则,其实这也是很容易的,下面是我自己总结的内存管理规则:

1、对你自己拥有的对象负责,也就是说你只能释放你拥有的对象,一般来说需要我们管理的是堆区;

2、凡是通过retain,alloc,copy等获得了所有权的对象,都必须在你不再使用它的时候,由你来调用release,autorelease等手段来释放对它的所有权;

3、在一定的段码内,对同一个对象所做的copy、alloc和retain的操作次数应当与release和autorelease操作的次数相等;

4、可以在类的dealloc方法中释放你所占有的实例变量;

5、对于便利构造器和访问器来说,你没有通过上面的这些手段获得对象的所有权,因此在这些情况下你无须对获得对象进行额外的释放操作。

6、autorelease只不过意味着"预定延迟发送一条release"消息,当前的引用计数并没有变。

.......属性:属性相当于是setter和getter方法,当我们声明了属性之后,如果在.m中不写@synthesize那么系统会自动的默认给我生成_属性名的实例变量,定义属性是

@property (属性的属性) 属性类型  属性名属性的属性下面我们下面介绍,当我们用.调用属性的时候相当于调用了setter和getter方法。

.......属性的属性有三种,1、可读性(readonly,readwrite)readonly调用的时候是只能调getter方法,readwrite调用的是setter和getter方法,默认的是readwrite。 2、原子性(nonatomic,atomic)原子性控制,atomic在多线程的情况下为了安全性的时候使用。3、语义(retain,copy,assign)assign一般用于基本数据类型,默认的是assgin,如果某个属性用了copy那么这个属性的类要实现NSCopying的协议。

.........下面我通过一个类来说明问题:

.h文件

@interface Person : NSObject<NSCopying>

//定义属性
@property (nonatomic,retain)NSString *name;//姓名
@property(nonatomic,assign)NSInteger age;//年龄
@property (nonatomic,copy)NSString *sex;//性别

//初始化方法
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age ;
//便利构造器
+ (Person *)personWithName:(NSString *)name age:(NSInteger)age;

@end

.m文件

#import "Person.h"

@implementation Person

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age
{
    if (self=[super init]) {
        self.name=name;
        self.age=age;
    }
    return self;
}
- (id)copyWithZone:(NSZone *)zone//实现copy协议,重写copy的方法
{
    return [[Person alloc]initWithName:[self.name copy] age:self.age];
   
}
- (void)dealloc
{
    [_name release];//在dealloc中释放你所占用的资源
    [super dealloc];
}
+ (Person *)personWithName:(NSString *)name age:(NSInteger)age
{
    return [[[Person alloc]initWithName:name age:age] autorelease];
}//在这里用autorelease
@end
main.m文件

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Person *person=[[Person alloc]initWithName:@"张三" age:20 ];
        
        Person *person1=[Person personWithName:@"李四" age:18];
        
        person.name=@"王五";//在这里person改名字相当于给person发一个消息用setter设置姓名
        
        
        [person release];//在这里用alloc给person开辟了空间,那么就对应的用release释放
        
    }
 
 
  return 0;
}

注意事项:如果在上面的.m文件中写上了[person1 release];那么将会出现crash,因为person1没有alloc不用我们自己去手动释放,便利构造器中有autorelease,当程序结束的时候,自动释放池中的所有对象的引用计数器都要减1。


注意事项:自己创建的对象,自己手动去释放,alloc、retain、copy和release、autorelease要保持平衡,当属性中用了retain的时候,在重写copy函数的时候注意处理引用计数器。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值