2012-02-10 20 views
6

thể trùng lặp:
Prefixing property names with an underscore in Objective CViewController = _ViewController nghĩa

Tôi chỉ mới bắt đầu iphone phát triển ứng dụng và nhận thấy rằng khi bạn tạo một dự án mới, các mã sau đây có thể được nhìn thấy trong appdelegate. m

@synthesize window = _window; 
@synthesize viewController = _viewController; 

VÀ trong tệp AppDelegate.h nó nói

@property (strong, nonatomic) UIWindow window; 
@property (strong, nonatomic) ViewController controller; 

Tôi chỉ muốn biết chính xác điều này có nghĩa là gì, đặc biệt là phần tổng hợp. Có phải là khởi tạo biến riêng tư cục bộ không? Nếu có, cách này khác với cách nói @synthesize viewController;

Cảm ơn

+1

http://stackoverflow.com/q/7174277/ http://stackoverflow.com/q/822487/ http://stackoverflow.com/q/2371489/ http://stackoverflow.com/q/6139593/ http: // stackoverflow .com/search? q =% 5Bobjc% 5D + gạch dưới + thuộc tính & gửi = tìm kiếm –

Trả lời

6

Các mô hình @synthesize foo = bar; cho phép bạn xác định một tài sản của chính foo mà được tổng hợp kết hợp với một biến thể hiện của tên bar (hoặc _foo nếu bạn muốn), trong khi @synthesize foo; chỉ đơn giản là tổng hợp một biến tài sản và ví dụ có cùng tên (foo).

@property (...) Foo *foo; 
@synthesize foo = _foo; 

là loại tương đương như sau:

@interface MyClass : NSObject { 
    //result of @synthesize...: 
    Foo *_foo; 
} 

//result of @property...: 
- (void)setFoo:(Foo *)foo; 
//result of @property...: 
- (Foo *)foo; 

@end 

@implementation MyClass 

//result of @synthesize...: 
- (void)setFoo:(Foo *)foo { 
    _foo = foo; //simplified! 
} 

//result of @synthesize...: 
- (Foo *)foo { 
    return _foo; //simplified! 
} 

@end 

Biến dụ synthezised sẽ những được sử dụng thông qua một trong hai _foo hoặc self->_foo (trong đó cựu thực sự là một hình thức tiềm ẩn), trong đó sẽ bao gồm không phương thức truy cập gọi bất kì cái gì.

Trong khi thuộc tính synthezised sẽ được sử dụng qua self.foo, sau đó sẽ sử dụng cuộc gọi đến một trong các phương pháp truy cập tổng hợp.

Chỉ cần nghĩ về @synthesize foo; là ẩn chứa (lưu ý thiếu số _ ở đây, tên bằng nhau).

5

Nhiều hơn hoặc ít hơn. Những dòng trong .h tuyên bố sự tồn tại của hai biến nào được gọi là cửa sổ và điều khiển:

@property (strong, nonatomic) UIWindow window; 
@property (strong, nonatomic) ViewController controller; 

Nhưng những dòng này chỉ tuyên bố sự tồn tại của các biến, họ không thực sự tạo ra chúng. Tuy nhiên, tùy thuộc vào lớp để thực hiện những điều này - chúng có thể là các biến ảo, không thực sự tồn tại nhưng gọi các phương thức tạo dữ liệu theo chương trình hoặc tải nó từ cơ sở dữ liệu hoặc một thứ gì đó.

Những dòng này trong tệp .m thực sự tạo ("tổng hợp") các biến.

@synthesize window = _window; 
@synthesize viewController = _viewController; 

Những dòng này thực sự nói là tên biến nội bộ là _window, nhưng tên công khai của biến là cửa sổ.Điều đó có nghĩa rằng trong lớp học mà bạn có thể truy cập các biến trực tiếp bằng cách nói

_window = something; 

Nhưng bên ngoài bạn phải truy cập nó bằng cách sử

appDelegate.window = something; 

Bởi vì đó là tên của nó công cộng. Bạn cũng có thể truy cập nó vào trong lớp bằng cách sử dụng self.window.

Một thực tế thú vị khác của Objective-C là sử dụng cú pháp dấu chấm để truy cập các biến theo cách này thực sự là một cách tiện dụng để gọi phương thức setter và getter để truy cập chúng. SO dòng tổng hợp, ngoài việc tạo ra một biến gọi là _window, cũng xác định hai phương pháp sau đây:

- (void)setWindow:(UIWindow *)window; // to set the _window variable 
- (UIWindow *)window; // to get the _window variable 

Và bạn có thể gọi những phương pháp trực tiếp nếu bạn thích, sử dụng

[self setWindow:someValue]; 
UIWindow *window = [self window]; 
Các vấn đề liên quan