设为首页 加入收藏

TOP

objective C 内存管理及属性方法详解(二)
2015-01-22 21:33:32 来源: 作者: 【 】 浏览:157
Tags:objective 内存 管理 属性 方法 详解

{

val=newVal;

}

copy:自动生成该对象的克隆


代码如下:

@property (nonatomic,copy) NSString *title;

-(NSString*)title
{
return title;
}
-(void)settitle:(NSString*)newtitile

{

//首先判断是否与旧对象一致,如果不一致进行赋值。

if(newTitle!=title)

{

[title release];
title=[newtitile copy];

}

}



retain:会自动retain对象,实现

代码如下:

@property (nonatomic,retain) NSString *title;

-(NSString*)title
{
return title;
}
-(void)settitle:(NSString*)newtitile

{

//首先判断是否与旧对象一致,如果不一致进行赋值。

//对于nil对象执行release,不会抛异常,如果不会nil,release正好释放旧的对象,这样就可以保证不会出现内存泄露

//因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。

if(newTitle!=title)

{

[title release];
title=[newtitile retain];

}

}

在对属性进行赋值时,会调用属性的set方法,使引用计数加一从而保证内存的正确引用。

自定义的类是不能用COPY的,因为自定义的类没有实现 协议,该协议里面有各种copy方法,所以,copy别乱用,尽量只在设置字符串时使用。

assign,retain 和 copy的区别

  • copy: 建立一个索引计数为1的对象,然后释放旧对象
  • retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
  • assign:直接复制,并未创建新的对象

    比如一个NSString对象,NSString *str=【NSString alloc】initwithString:@"hello";

    在内存分配的过程如下:

    首先,在堆上创建一块内存,内容初始化为“hello”,地址为0X1111

    其次,在栈上创建一内存,地址为0X2222,内容为1111,

    assign : NSString *newStr=[str assign];

    则newStr是str的别名,地址为0X2222,内容为1111,retaincount值不变,对newStr执行删除操作,则str也会被删除

    copy:NSString *newStr=[str copy];

    newStr地址为0×3333,内容为3333,在栈上分配空间,地址为0X3333,内容为“hello”,新的对象retainCount为1,str对象没有变化,对newStr执行删除操作只会涉及其本身,与str无关 retain:NSString *newStr=[str retain];

    newStr地址为0X4444,内容为1111,str的retaincount++,

    assign就是直接赋值,删除时可能引起问题,当数据为int, float等原生类型时,可以使用assign。retain使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。



首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言之深入指针与字符串 下一篇C语言统计一个字符串中单词的个数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: