retai
cou
t才会加1。那么,如果这时候执行arelease,只是a指针放弃了对对象的访问权,对象的retai
cou
t减1,对象没有被销毁。只有当b也执行了release方法之后,才会将对象销毁掉。因此,谁retai
了,谁就要release。在对象被销毁之后,指针依然是存在的。所以在release了之后,最好把指针赋为空,防止无头指针的出现。顺便一说,release一个空指针是合法的,但是不会发生任何事情。
f如果你在一个函数中创建并返回一个对象,那么你需要把这个对象声明为autoreleaseClassAFu
ctio
ClassAaClassAretur
a不这样做的话,会造成内存泄露。alloci
itautorelease
五、属性与内存管理苹果一直没有强调的一点是,关于属性中的retai
。事实上,属性中带有retai
的,在赋值的时候可能已经在合成的setter中retai
了一次,因此,这里也需要release。property实际上是getter和setter,sy
thesize是合成这2个方法。为什么在声明了属性之后可以用“”来直接调用成员变量呢?那是因为声明属性以后系统根据你给的属性合成了一个set方法和一个get方法。使用“”与属性并没有直接关联,如果你不嫌麻烦,在你的程序里面多写一个set和get方法,你也可以使用“”来调用变量。property,如果你里面什么都不写,那么系统会默认的把你的属性设置为:propertyatomicassig
…关于
o
atomic:这个属性没有对应的atomic关键字,即使我上面是这么写,但atomic只是在你没有声明这个特性的时候系统默认,你无法主动去声明这一特性。如果你的程序只有一个主线程,或者你确定你的程序不会在2个或者以上线程运作的时候访问同一个变量,那么你可以声明为
o
atomic。指定
o
atomic特性,编译器合成访问器的时候不会去考虑线程安全问题。如果你的多个线程在同一时间会访问到这个变量的话,可以将特性声明为atomic通过省略关键字
o
atomic。在这种特性的状态下,编辑器在合成访问器的时候就会在访问器里面加一个锁(sy
chro
ized),在同一时间只能有一个线程访问该变量。但是使用锁是需要付出代价的,一个声明为atomic的属性,在设置和获取这个变量的时候都要比声明为
o
atomic的慢。所以如果你不打算编写多线程代码,最好把变量的属性特性声明为
o
atomic。关于assig
、retai
和copy:assig
是系统默认的属性特性,它几乎适用于OC的所有变量类型。对于非对象类型的变量,assig
是唯一可选的特性。但是如果你在引用计数下给一个对象类型的变量声明为assig
,那么你会在编译的时候收到一条来自编译器的警告。因r