加入收藏 | 设为首页 | 会员中心 | 我要投稿 三明站长网 (https://www.0598zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Objective-C属性介绍

发布时间:2021-11-21 13:44:01 所属栏目:教程 来源:互联网
导读:Objective-C属性简介 @property 和@synthesize 可以自动生成某个类成员变量的存取方法, 语法 @property(参数) 类型 名字 这里的参数分为三大类: 读写属性:(readwrite/readonly) readwrite:这个属性是默认的,readonly:只生成getter 不会有setter 原子

Objective-C属性简介
 
@property 和@synthesize 可以自动生成某个类成员变量的存取方法,
 
语法 @property(参数) 类型 名字
 
这里的参数分为三大类:
 
读写属性:(readwrite/readonly) readwrite:这个属性是默认的,readonly:只生成getter 不会有setter
 
原子性(nonatomic)atomic ;是为了保证程序能够并发,避免同步问题
 
内存管理:(assign/retain/copy)
assign:这个属性用来处理基础类型,比如int,float,如果你声明的类型就是基础类型,该属性可以不加
 
对于assign而言,set函数和get函数如下所示:
 
@property(nonatomic,assign)int val;
 
-(int)val
 
{
 
 return val;
 
}
 
(void)setVal:(int)newVal
 
{
 
val=newVal;
 
}
 
copy:自动生成该对象的克隆
 
retain:会自动retain对象,实现
 
代码如下:
 
@property (nonatomic,assign) NSString *title;
 
-(NSString*)title
{
    return title;
}
-(void)settitle:(NSString*)newtitile
 
{
 
  //首先判断是否与旧对象一致,如果不一致进行赋值。
 
//因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。
 
if(newTitle!=title)
 
{
 
    [title release];
    title=[newtitile retain];
 
}
 
}
 
在对属性进行赋值时,会调用属性的set方法,使引用计数加一从而保证内存的正确引用。
 
自定义的类是不能用COPY的,因为自定义的类没有实现<NSCopy>协议,该协议里面有各种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各自有自己的内存。

(编辑:三明站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!