3.成員變量標準訪問方法的實現(@property和@synthysize)

一、@property和@synthesize的用途:xcode

@property、@synthesize用於自動生成類成員變量的存取方法(setter方法和getter方法)。多線程

@property用在頭文件裏邊,而@synthesize用於源文件裏邊。( xcode4.5以及之後的版本,@synthesize能夠省略)atom

在默認狀況下,當源文件裏邊沒有實現setter和getter方法時,經過synthysize能夠自動生成標準的setter和getter方法。注意:經過synthysize實現的setter和getter都是原子性訪問的。多線程同時訪問時,保障訪問方法同時只能被一個線程訪問。spa

如:
線程

(1)YtsStudent.h:code

#import <Foundation/Foundation.h>
@interface Student : NSObject
{
	int _age;
	int _no;
}
@property int age;
@property int no;
@end

 

(2)YtsStudent:m對象

#import "Student.h"
@implementation Student
@synthesize age=_age, no=_no,name;	//由於代碼中沒有定義成員變量name,因此係統將自動生成一個成員變量name。
@end


二、@property的聲明列表主要包括:內存

1.聲明屬性的訪問方法:get

getter=getterNameit

setter=setterName

聲明訪問屬性的設置與獲取方法名。


2.聲明屬性的寫操做權限

readwrite   -- 聲明屬性爲讀寫屬性,便可訪問setter方法,也能夠訪問getter方法,與readonly互斥。

readonly    -- 聲明屬性爲只讀屬性,只能訪問getter方法(即只自動生成getter方法),與readwrite互斥。


3.聲明寫方法的實現

assign  -- 聲明在setter方法中,採起直接賦值來實現設置操做。

效果如:

-(void)setName:(NSString *)_name{
    name =_name;
}


retain  -- 聲明在setter方法中,須要對設置的值進行retain加1操做。

效果如:

-(void)setName:(NSString *)_name{
    if(name!=_name){
        [name release];
        name = [_name retain]
    }
}


copy    -- 指定應該使用對象的副本(深度拷貝),對原值發送一條release消息,而後再copy。基本上像retain,可是沒有增長引用計數,是分配一塊新的內存來放置它。

效果如:

-(void)setName:(NSString *)_name{
    if(name!=_name){
        [name release];
        name = [_name copy]
    }
}


注意:

(1)assign、retain、copy在使用上的區別:

若是將一個對象賦給某成員變量,那麼使用retain時,當外面的對象改變,則成員變量的值也會改變;

若是使用copy,由於是拷貝產生了新的對象,因此name不會改變。

建議:

(1)使用assign : 基礎數據類型(NSInteger,CGFloat)和C數據類型(int, float, double, char等等)。

(2)使用copy   : NSString。

(3)使用retain : 其餘NSObject和其子類。


4. 聲明方法的原子性

nonatomic   -- 設置屬性的訪問爲非原子性訪問。

在默認狀況下,經過synthysize實現的setter和getter都是原子性訪問的。多線程同時訪問時,保障訪問方法同時只能被一個線程訪問。

相關文章
相關標籤/搜索