3 屬性與實例變量

類型成員

這裏寫圖片描述

數據成員

*注意,可以用屬性訪問的情況下,儘量不要直接訪問實例變量,否則引用可能會有內存管理問題出現。
初始化和析構器以及自定義訪問器方法中才直接訪問實例變量。因爲這引用類型有內存管理附加方法,但是這三個方法的生存週期比較特殊,因此不會出現問題。

// @property 類型 [類類型需要'*'號,值類型不需要] 屬性名稱;
@property NSString * name;
@property int age;

// 可以自定義訪問器方法
@property (getter=giveName, setter=setName) NSString * name;

/* OC中並不支持類屬性。
但是可以可以通過C語言方法模擬一個類屬性。 */
static int _max = 100;
+(int)max {
    return _max
}
+(void)setMax:(int)newValue {
    _max = newValue
}

// 可以直接定義實例對象,但是就只有類內可以訪問了。
@implementation CustomClass {
    int _age;
}

@end

這裏寫圖片描述

實例變量

實例變量一般都是私有的,但是可以通過@public 讓他公有化,但是,很少見。

@interface Shape : NSObject  {
    @public int _data;
}

// 訪問時,以類似C語言的風格進行
shape->_data = 10

這裏寫圖片描述

生存週期

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

atomic:

atomic屬性可以確保在多線程情況下,不會同時有多個線程對屬性進行操作。

weak:

ARC機制之下。通過自動引用計數來決定對象是否可以被釋放。
如果兩個對象之間相互引用,在該對象從棧上釋放之後,由於在堆中任然有指針指向他們,所以他們的自動引用計數會一直大於0,因此無法被釋放。
因此需要對這種情況下的對象使用(weak)描述特性,使用了weak之後,該指針不會增加自動引用計數,因此可以阻止循環引用。

copy:

正常情況下,對象之間的賦值其實是對指針的拷貝,因此賦值之後,賦值對象與被賦值對象其實是指向同一個堆的位置,當其中之一進行數據操作之後,其他對象也會被影響。
而加了copy之後,再進行賦值的時候,會對賦值對象進行深拷貝並傳遞拷貝出來的新內容給被賦值對象。這種情況下,會在堆中新建新的內容,因此不會相互影響。

發佈了35 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章