2012-01-09 5 views
5

Tôi đã xem Stanford iTunes U course on iOS (cs193p) nơi giáo viên một cách rõ ràng nói luôn ghi rõ tên Ivar khi sử dụng @synthesize để tránh các vấn đề, chẳng hạn nhưCó phải chỉ định tên ivar để @ psychheshesize được coi là dư thừa hoặc thực hành tốt không?

@synthesize name = _name; 

Nhưng khi duyệt qua Cocoa documentation on declared properties tôi đã không thực sự thấy điều này, hoặc trong bất kỳ mã mẫu nào khác.

Điều này mang lại cho tôi một câu hỏi, tại sao điều này lại cần thiết? Có đủ tốt để chỉ sử dụng @synthesize với tên thuộc tính không? Có bất kỳ vấn đề cụ thể nào mà điều này có thể giúp tránh không?

+0

có thể trùng lặp của [@synthesize ivarName = _ivarName quy ước, tùy chọn hoặc hiệu suất?] (Http://stackoverflow.com/questions/8333929/synthesize-ivarname-ivarname-convention-preference-or-performance) –

Trả lời

6

Lý do làm như vậy là để ngăn chặn các ivars được truy cập trực tiếp và do đó gây ra vấn đề quản lý bộ nhớ. Ví dụ:

Đúng: self.name = newName; Sai: name = newName;

Các getter và setter của tài sản đảm bảo rằng quản lý bộ nhớ được xử lý một cách chính xác. Để truy cập các ivars, bạn phải gõ một cách rõ ràng dấu gạch dưới hàng đầu, điều rất khó thực hiện một cách tình cờ. Thời gian duy nhất để truy cập trực tiếp vào các ivars là ở init, dealloc và getters và setters.

0

Nó chắc chắn không thừa vì @synthesize name = _name; có ý nghĩa khác là @synthesize name;. Cho dù bạn muốn đặt tên cho ngà voi của bạn khác với tài sản của bạn phần lớn là vấn đề sở thích cá nhân. Cả hai biến thể đều hoàn toàn ổn.

+0

Nhưng là một newbie to Objective-C, tôi không có bất kỳ sở thích cá nhân nào. Có lý do nào đằng sau lý do tại sao tôi nên sử dụng '@synthesize name = _name;' dài hơn? Liệu nó thực sự thay đổi bất cứ điều gì nếu tôi không có một getter/setter tùy chỉnh? –

1

Nếu bạn không chỉ định tên ivar, tên này sẽ sử dụng cùng tên với thuộc tính. Vì vậy, hai giá trị này tương đương nhau:

@synthesize name; 
@synthesize name = name; 

Nếu tất cả những gì bạn đang làm là name = name, thì có, nó hoàn toàn dư thừa.

Lý do tại sao mọi người chỉ định những thứ như name = _name là sử dụng tên khác cho ivar và thuộc tính. Một lý do để làm điều này là vì vậy bạn không bị lẫn lộn giữa tài sản và ivar, nhưng thẳng thắn, nếu bạn không rõ ràng về sự khác biệt, tinh chỉnh nhỏ này sẽ không cứu bạn.

+1

Tôi không chắc đó là vì mọi người bị "trộn lẫn", thay vì giúp ngăn chặn việc sử dụng ivar thay vì tài sản do nhầm lẫn. –