2008-08-29 30 views
12

Bạn có thể sử dụng ký hiệu chấm tiêu chuẩn hoặc gọi phương thức trong Mục tiêu-C để truy nhập thuộc tính của đối tượng trong Mục tiêu-C.Hiệu suất khác biệt giữa ký hiệu dấu chấm so với lời gọi phương thức trong Mục tiêu-C

myObject.property = YES; 

hoặc

[myObject setProperty:YES]; 

Có một sự khác biệt trong hoạt động (về việc tiếp cận các tài sản)? Nó chỉ là vấn đề ưu tiên về mặt mã hóa?

Trả lời

19

Ký hiệu dấu chấm để truy cập thuộc tính trong Mục tiêu-C gửi tin nhắn, giống như ký hiệu khung. Tức là, cho điều này:

@interface Foo : NSObject 
@property BOOL bar; 
@end 

Foo *foo = [[Foo alloc] init]; 
foo.bar = YES; 
[foo setBar:YES]; 

Hai dòng cuối cùng sẽ biên dịch chính xác như nhau. Điều duy nhất thay đổi điều này là nếu thuộc tính có thuộc tính getter và/hoặc setter được chỉ định; tuy nhiên, tất cả những gì nó làm là thay đổi thông điệp nào được gửi đi, cho dù tin nhắn có được gửi hay không:

@interface MyView : NSView 
@property(getter=isEmpty) BOOL empty; 
@end 

if ([someView isEmpty]) { /* ... */ } 
if (someView.empty) { /* ... */ } 

Cả hai dòng cuối cùng sẽ biên dịch giống hệt nhau.

0

Theo như tôi đã thấy, không có sự khác biệt đáng kể về hiệu suất giữa hai. Tôi chắc chắn rằng trong hầu hết các trường hợp, nó sẽ được 'biên dịch' xuống cùng một mã.

Nếu bạn không chắc chắn, hãy thử viết một ứng dụng thử nghiệm thực hiện từng phương pháp một triệu lần hoặc lâu hơn, tất cả thời gian trong khi phải mất bao lâu. Đó là cách duy nhất để chắc chắn (mặc dù nó có thể khác nhau về kiến ​​trúc khác nhau.)

4

Kiểm tra article from Cocoa is My Girlfriend. Gist của nó, là không có hình phạt hiệu suất của việc sử dụng một trong khác.

Tuy nhiên, ký hiệu làm cho việc xem điều gì đang xảy ra với biến của bạn trở nên khó khăn hơn và biến của bạn là gì.

4

Lần duy nhất bạn sẽ thấy sự khác biệt hiệu suất là nếu bạn không đánh dấu thuộc tính là "nonatomic". Sau đó @synthesize sẽ tự động thêm mã đồng bộ xung quanh cài đặt thuộc tính của bạn, giữ cho chuỗi đó an toàn - nhưng chậm hơn để đặt và truy cập.

Như vậy chủ yếu là bạn có thể muốn xác định một tài sản như:

@property (nonatomic, giữ lại) NSString * myProp;

Cá nhân tôi thấy ký hiệu dấu chấm thường hữu ích từ quan điểm của bạn không phải suy nghĩ về cách viết phương thức setter chính xác, không hoàn toàn tầm thường ngay cả đối với người định cư không phải vì bạn cũng phải nhớ giải phóng giá trị cũ đúng cách. Sử dụng mã mẫu giúp bạn nhưng bạn luôn có thể mắc lỗi và thường là mã lặp đi lặp lại làm lộn xộn các lớp. Một mô hình cần lưu ý: nếu bạn tự xác định setter (thay vì để @synthesize tạo ra nó) và bắt đầu có các tác dụng phụ khác của việc thiết lập một giá trị, bạn nên đặt phương thức bình thường thay vì gọi bằng cách sử dụng ký hiệu đặc tính.

Thuộc tính sử dụng ngữ nghĩa dường như truy cập trực tiếp đến giá trị thực của người gọi và bất kỳ thứ gì thay đổi từ đó sẽ được thực hiện qua gửi tin nhắn, không truy cập vào thuộc tính (mặc dù cả hai đều gửi tin nhắn).

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