2010-07-03 38 views

Trả lời

13

Objective-C Runtime Programming Guide: Declared Properties

@property tuyên bố getter và setter cho các tài sản công cộng bạn muốn thực hiện. Ví dụ kê khai tài sản này:

@property float value; 

tương đương với:

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

@synthesize cung cấp thực hiện mặc định cho hai bộ truy xuất này.

Cập nhật: Phần trên giải thích những gì hai điều này thực hiện. Nó không giải thích mục đích của họ là gì. :-)

  • @property thêm thành viên vào giao diện công khai hoạt động như biến dữ liệu cho khách hàng lớp học, nhưng được đọc và viết bằng phương pháp. Điều này cho phép bạn kiểm soát tốt hơn dữ liệu được trao đổi giữa máy khách và mã của bạn, ví dụ bạn có thể thực hiện xác thực mở rộng trên các giá trị mà mã của bạn được cung cấp.
  • @synthesize cho phép bạn không viết mã rõ ràng sẽ được khách hàng gọi và thực sự xử lý thuộc tính dưới dạng biến dữ liệu.
+0

Tôi không biết liệu tôi có hiểu rõ điều này ... tại sao không chỉ làm: giá trị = 0,0; – esqew

+0

@ seanny94 Xem câu hỏi này: http://stackoverflow.com/questions/1568091/why-use-getters-and-setters –

+0

Câu trả lời là một phần sai. @property tuyên bố một getter (và/hoặc setter). Nó cũng khai báo một số khía cạnh của hành vi của getter/setter (ví dụ: giữ lại, sao chép, gán, nonatomic). @synthesize cung cấp một cài đặt mặc định của accessor (s) dựa trên @property. Cả hai điều này đều không cho phép bạn coi thuộc tính là một thành viên dữ liệu hơn là viết các khai báo và định nghĩa phương thức chuẩn. – JeremyP

0

Chỉ cần một ví dụ nhanh về việc tại sao bạn có thể không muốn làm chỉ là "biến = 0":

Giả sử bạn có khách sạn này:

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

Bất cứ khi nào bạn thay thế đại biểu rằng với một mới một, setters và getters tổng hợp của bạn sẽ xử lý việc phát hành/giữ lại cho bạn mỗi khi bạn đặt nó như vậy:

self.theDelegate = newObject; 

Thực sự những gì hap pened là thế này:

[self setTheDelegate:newObject]; 

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

(này được đơn giản hóa tất nhiên)

Bạn có thể làm những việc rất mạnh mẽ trong setters và thu khí của riêng bạn, tổng hợp dành cho những điều đó xảy ra hơn và hơn đặc tính giữ lại như vv Khi biên dịch nó nhìn vào @property của bạn và xây dựng các phương thức cho phù hợp.

3

Biểu tượng "@" được trình biên dịch hiểu là chỉ thị. Đây là một trong những mục tiêu-C 'bổ sung' cho ngôn ngữ C. Khi bạn khai báo @property và sau đó @synthesize bạn đang hướng dẫn trình biên dịch tạo ra các hướng dẫn và các ký hiệu tương ứng cho getters và setters cho bạn. Hãy nhớ rằng trong ngôn ngữ C, toán tử "=" có nghĩa là "gán". Phần lớn thời gian trong ngữ cảnh OO mà các phần mở rộng Objective-C cung cấp, chúng tôi đang làm việc với con trỏ (còn gọi là tham chiếu) đến cấu trúc dữ liệu isa (Các lớp trong Mục tiêu-C).

Trước mục tiêu-C 2.0, tất cả các phương thức getter và setter phải được mã hóa bởi nhà phát triển cho mọi thuộc tính mà đối với hầu hết các trường hợp là mã sao chép/dán. Để hoàn toàn tuân thủ KVC/KVO, hãy yêu cầu mã rất tẻ nhạt ... willAccessValueForKey, didUpdateValueForKey vv để trình biên dịch mới tự động thêm khi bạn sử dụng cú pháp @ property/@ synthesize. Đây là một tăng năng suất rất lớn cho các nhà phát triển. Những bổ sung dot cú pháp ngôn ngữ là nhiều hơn một chút tranh cãi trong cộng đồng như thế này ẩn diệu trình biên dịch được thực hiện trên bạn thay mặt để giải thích tuyên bố object.property = anotherObject.property; như [object setProperty:[anotherObject property]];

Từ các tài liệu của Apple nhắc đến trong câu trả lời khác

Tuyên bố tài sản thuộc tính

Bạn có thể trang trí một tài sản với các thuộc tính bằng cách sử dụng các hình thức @property (thuộc tính [, attribute2, ...]). Giống như các phương thức, các thuộc tính được đưa vào khai báo giao diện kèm theo của chúng. Đối với các khai báo thuộc tính sử dụng danh sách các tên biến được phân cách bằng dấu phẩy, các thuộc tính thuộc tính áp dụng cho tất cả các thuộc tính được đặt tên.

Nếu bạn sử dụng chỉ thị @synthesize để báo cho trình biên dịch tạo (các) phương thức truy cập, mã nó tạo phù hợp với đặc tả được cung cấp bởi từ khóa. Nếu bạn tự mình thực hiện (các) phương thức truy cập, bạn nên đảm bảo rằng nó khớp với đặc tả (ví dụ, nếu bạn chỉ định sao chép, bạn phải đảm bảo rằng bạn sao chép giá trị đầu vào trong phương thức setter).

3

Tôi hy vọng điều này sẽ giúp bạn.

@property và @synthesize được sử dụng để truy cập đối tượng hoặc biến thành lớp khác.

Dưới đây là một ví dụ nhỏ: Đây là First Class

#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 

Và Đây là Một Class:

#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); 
} 

Vì vậy, Bạn có thể Truy cập FirstName LastName Và vào ClassB.

Và Họ In:

2012-05-25 14: 38: 10,766 MyExample [8751: C07] FirstName = Ashvin 2012-05-25 14: 38: 10,768 MyExample [8751: C07] LastName = Ajadiya

Các vấn đề liên quan