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.
Nguồn
2012-01-18 17:41:21