NSLog(@"%p", &object);
Và NSLog(@"%p", object);
Sự khác biệt là gì?
Cả hai dường như in ra một địa chỉ bộ nhớ, nhưng tôi không chắc đâu là địa chỉ bộ nhớ thực của đối tượng.
Đây là cách tôi muốn tưởng tượng nó:
Bạn có thể coi bộ nhớ như một dải liền kề chứa địa chỉ của từng khối có sẵn.
NSObject *a = nil;
NSObject *b = nil;
ba
vv
+--------------+----------+--, ,-+----------+----------+
|
+----------+----------+-` `--+----------+----------+
^ ^ ^ ^
0x05aa2 0x05aaa 0x07bf0 0x07bf8
NSLog(@"%p %p", b, &b); //=> 0x0 0x07bf0
chúng tôi có hai NSObject *
các biến cục bộ của loại. cả hai đều được giao không
, vậy nội dung là 0x0
. Bạn có thể thấy rằng cả hai biến đều có địa chỉ bộ nhớ0x07bf0
Và0x07bf8
.
Sau đó, nếu chúng ta tạo một thể hiện của đối tượng và đặt nó vào hỗn hợp, chúng ta sẽ nhận được
NSObject *a = nil;
NSObject *b = [[NSObject phân bổ] init];
[NSObject]ba
vvv
+--------------+----------+--, ,-+----------+----------+
| | ******* |
+----------+----------+-` `--+----------+----------+
^ ^ ^ ^
0x05aa2 0x05aaa 0x07bf0 0x07bf8
^/
\ /
`-------------'
NSLog(@"%p %p", b, &b); //=> 0x05aaa 0x07bf0
Ngoại trừ bây giờ có b
nhọn NSObject
Đối với một ngoại lệ thực sự, chúng ta khai báo các biến cục bộ giống như trước.
Vì loại này là NSObject *
Chúng tôi biết chúng tôi có một con trỏ tới đối tượng, vì vậy khi bạn làm như vậy NSLog(@"%p", b);
Khi bạn nhận được địa chỉ bộ nhớ b
Sau đó lấy địa chỉ bộ nhớ trong nội dung của nó và theo nó đến NSObject
Sau đó in kết quả của địa chỉ bộ nhớ của nó. Khi bạn thực thi &b
khi bạn thực sự chỉ đang thực hiện bước đầu tiên và đối với biến thực tế b
Địa chỉ bộ nhớ của bộ nhớ được yêu cầu.
Bạn sẽ có thể thấy các địa chỉ bộ nhớ này liên quan với nhau như thế nào
Tôi là một lập trình viên xuất sắc, rất giỏi!