现在的位置: 首页 > 综合 > 正文

objective-c入门之@property指令 浅谈

2012年03月19日 ⁄ 综合 ⁄ 共 1735字 ⁄ 字号 评论关闭

最近学习了一下objective-c,对于新手,这个里面加的东西是不是很不习惯啊,是不是会对@property @synthesize这个指令感到比较奇怪呢?毕竟C里面没有这个“乱七八糟“的东西啊!!

首先介绍一下这个指令@property吧

 

这个“乱七八糟“的东西呢其实是一个很好的东西,如果你用很C的规范去写一个类时,你会不会要对这个类的成员进行写入和读取数据呢?答案是必然的,所以这时你就得写一个-(void) setX(id ..) 和一个-(id) X    (X代表成员的名字)来写入和读取这个成员的数据对吧, 这是不是很麻烦啊? 所以呢,objective-c2.0 就加了这个“乱七八糟“的东西,帮助一你一气呵成这些须要重复一遍又一遍的代码(尽管你可以复制,但我可以保证,你会按command+c  command+v按到手抽筋)。

 

好吧,废话不多,说点有用的。

 

 

 

 

@property指令中有三对参数,可能有人要问你,合成方法就合成方法呗,又搞这么多参数干什么?先别急,呆会儿你就开眼界了。

 

1,readwrite,readonly,设置可供访问级别

2,assign/retain/copy
     assign,setter方法直接赋值,不进行任何retain操作。
     retain,setter方法对参数进行release旧值再retain新值。
     copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。

3,nonatomic/atomic.

 

第一组参数就不介绍了,相信大家都 懂的。重点想说一下第二组参数 上面简单的写了一下,可能有点含糊,没关系下面详细地说一下

 

假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉。 (大家可以先想想这个问题 )

 

  assign的话,就是简单的赋值,不引起retainCount的改变,当你在设置像int ,char ,float等原生类型的时候,用这个参数会有很不错的效果(因为就是一样基本类型嘛,a=1 (assign)一个b  当然也是1了),但是!! 在设置像一些对像的时候就会出现一样很明显的问题了(因为我们都 是用的指针)。想必你已 经有些明白了,假设a指向0x1111地址 开辟了一段内存  然后b也指向这个地址(显然assign)了,然后我release a    b呢? 是不是b也遭殃了?咋 办呢? objective-c里面就加入了一个引用计数机制,这时你就要用到retain了,同时刚才那个问题,如果b=[a retain];  [a release];会有什么不同呢?  这时objective-c里面引用计数机制起作用了,一开始a申请了一段空间,这时, retainCount=1; b=[a retain];( retainCount=2),[a release](注意,这时这块内存空间并没有释放 retainCount=1  还不为0    为0才会被释放)所以b依然可以高枕无忧的指过去。    现在懂了吧!

然后还有一个copy,这个好理解,a指向0x1111地址    b copy一份之后,就不是指向0x1111地址了,而可能指向0x2222地址,这样b与a就没有任何瓜葛了,它们井水不犯河水,想当你硬要说它们有瓜葛因为他们值相等,我也没办法,就像有人说你这张一百的是他的一样,因为他也一张面值一百的大钞,纠结啊!!!!

 

好了,终于啰嗦完了,还有一对nonatomic/atomic 这个的话,我目前也不清楚什么是原子操作,什么是非原子操作,还请大家多多指教 啦!!!

 

还有,注意一下@property的默认参数,这我就不说了,大家可以自己去查一查。。。

 

可能有什么错误的,还请大家批评指正,我也是初学者,在这班门弄斧,真是过意不去啊!还请菩萨保佑!

 

 

 

抱歉!评论已关闭.