1.類型成員
1)數據成員:描述對象的狀態
-屬性@property:外部狀態 表達實例的狀態 對外的接口
問:編譯器會為屬性定義生成什么?
默認情況,編譯器會為屬性定義propertyName自動合成:
*一個getter訪問器方法:propertyName
*一個setter訪問器方法:setPropertyName
*一個實例變量_propertyName
/*自動合成
- (NSString *)firstName
{
return _firstName;
}
- (void)setFirstName:(NSString *)newValue
{
_firstName = newValue;
}
*/
main方法:
//屬性基礎
Employee *employee = [[Employee alloc] init];
[employee setFirstName:@"wu"];//訪問器方法
[employee setLastName:@"yy"];
[employee print];
employee.firstName = @"h";//屬性表達式
employee.lastName = @"w";
[employee print];
employee.age = 30;
// employee._tempConut = 100;類外不可以訪問實例方法;
[Employee setMax:500];//類型屬性
Employee.max = 400;//getter訪問器方法
-實例變量:對內的 只有實例變量,沒有類變量;
如果自定義了getter和setter,或者是只讀屬性 readonly定義了getter方法 編譯器不在合成實例變量。
理解使用實例變量與屬性的時機
在類外一定要使用屬性來訪問,類內大多數通過self.來訪問
- (NSString *)fullName
{
return [NSString stringWithFormat:@"%@",self.fullName];
}
只有以下情況使用實例變量來訪問:
初始化器 init
析構器 dealloc
自定義訪問器方法
有一個內存管理的背后操作,實例變量沒有,會失去保護。生存周期比較獨特。
實例變量的生存周期
實例變量的存儲,跟隨對象實例存儲在堆上。
值類型實例變量直接“內嵌”在對象實例中,跟隨對象實例內存釋放而被釋放。
引用類型的實例變量通過指針“引用”堆上的引用類型實例,ARC針對引用進行計數管理,自動釋放引用計數為0的對象。
屬性的描述特性
讀寫特性以及多線程特性:
@property (readonly)NSString *fullName;//只讀屬性 不能改set 只能get
employee.fullName = @"a";//在main函數里面不能訪問 會報錯
@property (readwrite)NSString *str;//默認
@property (atomic)NSString *firstStr;//多線程屬性 原子性默認
@property (nonatomic)NSString *lastStr;//非原子性
內存管理的特性
ARC環境
&強引用 strong(默認)
&弱引用 weak 防止循環引用
&拷貝屬性 copy 創建獨立拷貝
@interface Workitem : NSObject
@property (copy)NSString *content;//拷貝屬性 針對可變集合類型 創建獨立拷貝
@property int term;
@property (weak)Employee *owner;//反向執行
其它情況
&retain
&assign
&unsafe-unretained