Tôi hiện đang bị nhầm lẫn bởi con trỏ tới con trỏ mặc dù tôi đã đọc Why does NSError need double indirection? (pointer to a pointer) và NSError * vs NSError ** và hơn thế nữa.Không thể hiểu hành vi truyền con trỏ NSError/NSObject
Tôi đã thực hiện một số suy nghĩ và vẫn có một số câu hỏi.
Ở đây tôi đã viết này:
NSError *error = [NSError errorWithDomain:@"before" code:0 userInfo:nil];
NSLog(@"outside error address: %p", &error];
[self doSomethingWithObj:nil error:&error];
Để kiểm tra các NSError
phương pháp trên, tôi đã viết này:
- (id)doSomethingWithObj:(NSObject *)obj error:(NSError *__autoreleasing *)error
{
NSLog(@"inside error address: %p", error);
id object = obj;
if (object != nil)
{
return object;
}
else
{
NSError *tmp = [NSError errorWithDomain:@"after" code:0 userInfo:nil];
*error = tmp;
return nil;
}
}
Nhưng tôi phát hiện ra rằng hai địa chỉ khai thác gỗ là khác nhau. Tại sao vậy?
2016-08-19 19:00:16.582 Test[4548:339654] outside error address: 0x7fff5b3e6a58
2016-08-19 19:00:16.583 Test[4548:339654] inside error address: 0x7fff5b3e6a50
Chúng không giống nhau vì đó chỉ là bản sao giá trị đơn giản? Nếu chúng khác nhau, làm thế nào để con trỏ trỏ đến cùng một ví dụ NSError
?
Trình biên dịch phải làm điều gì đó với con trỏ đến con trỏ, có lẽ để xử lý ARC. Trong phiên bản mới nhất của con trỏ Objective-C có quá nhiều thông minh, vì vậy những gì từng là một bản sao giá trị đơn giản có thể không còn đơn giản như vậy nữa. Bạn có thể muốn tái cụm từ câu hỏi này theo cách không liên quan gì đến 'NSError' - nói," Con trỏ trỏ đến thay đổi khi được truyền như tham số phương thức ", hoặc một cái gì đó tương tự. – dasblinkenlight
Nhưng NSError * __autoreleasing * là một mẫu được sử dụng ở mọi nơi và được trình biên dịch nhận ra và xử lý khác nhau. – gnasher729