2012-01-18 25 views
8

Trình biên dịch dường như không có vấn đề với hai tờ khai sau:__strong và vị trí từ khóa __weak - Objective-C

NSObject * __weak weakThing; 
__weak NSObject *anotherWeakThing; 

Có một sự khác biệt giữa hai? Hành vi như là const keyword?

Tôi hỏi vì cảnh báo Xcode của thường đề nghị ...

SomeDataType * __weak/__strong

... khi bạn đã goofed cái gì đó lên. Vì vậy, tôi đã cố gắng để làm theo mô hình này, nhưng tự hỏi nếu có một sự khác biệt ở tất cả.

Trả lời

13

Không, không có sự khác biệt. Với từ khóa const, có nhiều thứ có thể áp dụng trong một tuyên bố; nó có thể áp dụng cho con trỏ, hoặc nó có thể áp dụng cho giá trị được trỏ đến.

Vòng loại quyền sở hữu chỉ có ý nghĩa về con trỏ đến đối tượng. Đối tượng không thể "mạnh" hoặc "yếu"; đó là con trỏ đến đối tượng mạnh hoặc yếu. ARC chỉ có ý nghĩa khi áp dụng trực tiếp cho các kiểu con trỏ tới đối tượng và ảnh hưởng đến thời gian của con trỏ sẽ ảnh hưởng đến tuổi thọ của đối tượng.

Vì không bao giờ có bất kỳ sự mơ hồ nào về điều mà vòng loại quyền sở hữu có thể áp dụng, đặc tả ARC cho phép vị trí của vòng loại quyền sở hữu ở bất kỳ đâu trong định nghĩa của đối tượng trỏ tới đối tượng. Cả hai ví dụ của bạn đều có giá trị như nhau. Tương tự như vậy, tất cả những điều sau đây có nghĩa là cùng một điều:

NSError * __autoreleasing * someObject; 
NSError __autoreleasing ** someObject; 
__autoreleasing NSError ** someObject; 

Lưu ý rằng trình biên dịch phàn nàn về việc này, mặc dù:

NSError ** __autoreleasing someObject; 

Điều này là do bạn đã chuyển vượt ra ngoài định nghĩa của pointer- đối tượng. Bạn có thể phân tích cú pháp đó là (NSError *)* __autoreleasing someObject;. Khi bạn đến được số * thứ hai, bạn đã xác định loại con trỏ, vì vậy __autoreleasing không có ý nghĩa gì cả. Bất cứ nơi nào trong định nghĩa của kiểu con trỏ đều tốt, nhưng một khi bạn di chuyển lên kiểu con trỏ tới con trỏ, thì bạn đang đề cập đến một cái gì đó khác, và nó không còn ý nghĩa nữa.

6

một sự khác biệt nếu bạn có

__weak NSObject *someWeakThing, *someSupposedlyButNotReallyWeakThing; 

vì __weak sẽ chỉ gây nhầm lẫn áp dụng đối với các biến đầu tiên. (đây là một sai lầm tương tự đối với tân binh

NSObject* one, two; 

tất nhiên sẽ không hoạt động như "mong đợi").

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