NSLog địa chỉ bộ nhớ của đối tượng trong phương thức mô tả bị ghi đè


116

Tôi đang ghi đè phương thức mô tả của một đối tượng. Tôi cần biết cách in địa chỉ bộ nhớ của đối tượng để thay thế {???} trong mã bên dưới:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %@>\nparmeterOne: %@\nparameterTwo: %@",
            {???}, self.parameterOne, self.paramterTwo];
}

Tôi muốn nó được in trong bảng điều khiển như thế này:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages

Câu trả lời:


212

Để in địa chỉ sử dụng %pđịnh dạng định dạng và con trỏ tự:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}

6
sử dụng self với specifier '% @' thực sự sẽ gây ra đệ quy vì điều đó sẽ thực hiện lại cuộc gọi phương thức mô tả. % p specifier chỉ xuất địa chỉ con trỏ
Vladimir

3
Tôi có xu hướng [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- địa chỉ kết thúc ở đó vì NSObjectcó nó, nhưng bạn cũng không vứt bỏ bất cứ thứ gì bạn quyết định có liên quan đến việc gỡ lỗi trong bất kỳ siêu lớp nào mà bạn có thể đang thừa hưởng.
Tommy

7
Lưu ý bổ sung: %pmong đợi một con trỏ loại void *, bạn phải selfquay lại void *, hành vi không xác định khác xảy ra.

4
@ user529758: không cần truyền, không có hành vi không xác định. void *idbên trong gần như giống nhau, và trong trường hợp này, không có sự khác biệt nào khi bạn bỏ nó void *hay không.
Michael

1
Bạn phải đặt biểu tượng '&' trước khi tranh luận 'bản thân'
Artyom Devyatov

6

Phương pháp đơn giản nhất là sử dụng siêu mô tả

- (NSString *)description
{
    return [NSString stringWithFormat:@"%@ Area: %@, %@", [super description], self.identifier, self.name];
}

Vì vậy, trong trường hợp đối tượng mô hình này là một lớp con của NSObject, bạn có thể tránh việc làm thêm và ghi nhớ %p.

Sử dụng thủ công NSStringWithClass () và% p

- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p> Area: %@, %@", NSStringFromClass([self class]), self, self.identifier, self.name];
}

Vì vậy, trong trường hợp mô hình đối tượng mà bạn có một trình triển khai cụ thể được bắt nguồn từ lớp này, bạn sẽ hiển thị tên lớp chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.