在ARC有效時,其類型上必須附加所有權(quán)修飾符,用來管理屬性在內(nèi)存中的生命周期。
所有權(quán)修飾符一共4種,
______strong
______weak
______unsafe_unreationed
__autoreleasing
| 屬性聲明的屬性 | 所有權(quán)修飾符 |
|---|---|
| assign | __unsafe_unreationed 修飾符 |
| copy | __strong 修飾符 (但是賦值得是被復(fù)制的對象) |
| reatin | __strong 修飾符 |
| strong | __strong 修飾符 |
| unsafe_unreatined | __unsafe_unreationed 修飾符 |
| weak | __weak 修飾符 |
然后在聲明成員變量時,如果同屬性聲明中的屬性不一致就是引起編譯錯誤。例如:
** 錯誤聲明,同屬性聲明中的屬性不一致 **
<pre> @property (nonatomic,weak) id obj;</pre>
** 正確聲明 **
<pre>@property (nonatomic,weak) id __weak obj;
//或者
@property (nonatomic,strong) id obj;</pre>
然后分別詳細說明所有權(quán)修飾符的使用
__strong
__strong修飾符是 id類型 和 對象類型 的默認(rèn)所有權(quán)修飾符。
<pre> id obj = [[NSObject alloc] init];
等于
id __strong obj = [[NSObject alloc] init];
</pre>
__weak
因為帶有______strong 修飾符的成員變量在持有對象時,很容易發(fā)生循環(huán)引用,循環(huán)引用很容易導(dǎo)致內(nèi)存泄漏(既應(yīng)當(dāng)廢棄的對象在超出其生存周期后繼續(xù)存在)。所以蘋果引入了 ______weak修飾符。
1.若附有______weak修飾符的變量所引用的對象被廢棄,則將nil賦值給該變量。
2.使用附有____weak修飾符的變量,即是使用組成到autoreleasepool中的對象。
通過上面2特性,使用__weak修飾符可避免循環(huán)引用。并且檢查附有__weak修飾符的變量是否為nil,可以判斷被賦值的對象是否已廢棄。
__unsfe_unretained 修飾符
______unsfe_unretained修飾符是不安全的所有權(quán)修飾符,并且附有__unsfe_unretained修飾符的變量不屬于編譯器的內(nèi)存管理對象。
然后在iOS4 以及 OS X Sonw Leopard 的應(yīng)用程序中,必須使用__unsfe_unretained修飾符來替代__weak修飾符。并且注意一點是,賦值給附有__unsfe_unretained修飾符變量的對象在通過該變量使用時,必須確保其確實存在,否則將會引起程序崩潰。