2010-07-03 87 views

回答

13

Objective-C Runtime Programming Guide: Declared Properties

@property聲明getter和你要實現的公共財產setter方法。例如,這屬性聲明:

@property float value; 

等同於:

- (float)value; 
- (void)setValue:(float)newValue; 

@synthesize提供了這兩個訪問器默認的實現。

更新:上面解釋了這兩者的作用。它沒有解釋他們的目的是什麼。 :-)

  • @property增加了一個成員充當數據變量類客戶的公共接口,但讀取和使用方法編寫的。這使您可以更好地控制客戶端與代碼之間交換的數據,例如,您可以對代碼的賦值進行擴展驗證。
  • @synthesize允許您不顯式編寫將由客戶端調用的代碼,並將該屬性實際上視爲數據變量。
+0

我不知道我是否完全明白這一點......爲什麼不這樣做: value = 0.0; – esqew 2010-07-03 00:51:25

+0

@ seanny94看到這個問題:http://stackoverflow.com/questions/1568091/why-use-getters-and-setters – 2010-07-03 03:18:01

+0

答案是部分錯誤的。 @property聲明一個getter(和/或setter)。它還聲明瞭getter/setter的某些行爲方面(例如retain,copy,assign,nonatomic)。 @synthesize提供基於@property的訪問器的默認實現。這些都不允許您將屬性視爲數據成員,而不是寫出標準方法聲明和定義。 – JeremyP 2010-07-03 12:32:40

0

只是爲什麼您可能不希望做一個簡單的例子只是「變量= 0」:

說你有這個屬性:

@property (nonatomic, retain) id <MyDelegate> theDelegate; 

每當更換該委託一個新的其中一個,你的合成二傳手和吸氣工具會在你每次設置它時處理釋放/保留:

self.theDelegate = newObject; 

真的是什麼hap pened是這樣的:

[self setTheDelegate:newObject]; 

- (void)setTheDelegate:(id <MyDelegate>)anObject { 
    [theDelegate release]; 
    theDelegate = [anObject retain]; 
} 

(這是簡化當然)

你可以做的非常強大的東西在自己的getter和setter方法,合成是對於那些發生遍地喜歡保留屬性等編譯時會查看@property並據此構建方法。

3

編譯器將「@」符號解釋爲指令。這是C語言的Objective-C'補充'之一。當你聲明@property然後@synthesize時,你指示編譯器爲你創建getter和setter的指令和相應的符號。請記住,在C語言中,「=」操作符表示「分配」。 Objective-C擴展提供的面向對象上下文大多數情況下,我們正在使用指針(又名引用)來描述數據結構(Objective-C中的類)。

在Objective-C之前2。0,所有的getter和setter方法都必須由開發人員針對大多數情況下爲複製/粘貼代碼的每個屬性進行編碼。要完全符合KVC/KVO,需要許多非常乏味的代碼... willAccessValueForKey,didUpdateValueForKey語句等新編譯器在您使用@ property/@ synthesize語法時爲您自動添加的內容。這對開發者來說是一個巨大的生產力提升點語法增加的語言是在社會上多一些爭議,因爲這隱藏魔法編譯器上,你做代表解釋object.property = anotherObject.property;語句[object setProperty:[anotherObject property]];

從其他的答案

引用的蘋果文檔

財產申報使用表格屬性@property

可以裝飾與屬性的屬性(屬性[,attribute2,...])。與方法類似,屬性的作用域被封裝在接口聲明中。對於使用逗號分隔的變量名列表的屬性聲明,屬性屬性適用於所有命名的屬性。

如果使用@synthesize指令告訴編譯器創建存取方法,則其生成的代碼與關鍵字給出的規範相匹配。如果您自己實現訪問方法,則應確保它與規範相匹配(例如,如果指定了副本,則必須確保您在setter方法中複製輸入值)。

3

我希望這會幫助你。

@property和@synthesize用於訪問對象或變量到另一個類。

這裏是一個小例子: 這是頭等艙

#import <UIKit/UIKit.h> 
#import "ClassB.h" 
@interface ViewController : UIViewController 
@property(nonatomic, retain) NSString *FirstName; 
@property(nonatomic, retain) NSString *LastName; 


#import "ViewController.h" 
@interface ViewController() 
@end 
@implementation ViewController 
@synthesize FirstName, LastName; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.FirstName = @"Ashvin"; 
    self.LastName = @"Ajadiya"; 
    ClassB *ClassBOb = [[ClassB alloc] init]; 
    ClassBOb.ViewCntrlrOb = self; 
    [ClassBOb CallMe]; 
} 
@end 

,這是另一類:

#import <UIKit/UIKit.h> 
@class ViewController; 
@interface ClassB : UIViewController 
@property(nonatomic, retain) ViewController *ViewCntrlrOb; 
-(void) CallMe; 
@end 

#import "ClassB.h" 
#import "ViewController.h" 
@interface ClassB() 
@end 
@implementation ClassB 
@synthesize ViewCntrlrOb; 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 

-(void) CallMe 
{ 
    NSLog(@"FirstName = %@",ViewCntrlrOb.FirstName); 
    NSLog(@"LastName = %@",ViewCntrlrOb.LastName); 
} 

以便您可以訪問名字和姓氏爲ClassB的。

而且他們打印:

2012-05-25 14:38:10.766 myexample中[8751:C07]姓= Ashvin 2012-05-25 14:38:10.768 myexample中[8751:C07]名字= Ajadiya

相關問題