Tôi có một lớp cha và một lớp con, cả hai đều xác định các biến mẫu.Mục tiêu-C: các biến mẫu nằm ngoài phạm vi trong trình gỡ rối
phác thảo thô của lớp cha:
/* GenericClass.h */
@interface GenericClass : NSObject {
/* some variables */
}
@end
/* GenericClass.m */
@implementation GenericClass
/* ... */
@end
Outline của lớp con:
/* SpecificClass.h */
#import "GenericClass.h"
@interface SpecificClass : GenericClass {
NSMutableString *str;
}
/* SpecificClass.m */
#import "SpecificClass.h"
@implementation SpecificClass
- (void)aMethod {
//Debugger reports str as out of scope
str = [[NSMutableString alloc] initWithCapacity:100];
//Works fine:
self->str = [[NSMutableString alloc] initWithCapacity:100];
//Doesn't compile as I haven't defined @property/@synthesize:
self.str = [[NSMutableString alloc] initWithCapacity:100];
}
Khi tôi đang sử dụng các lớp kế thừa trực tiếp từ NSObject, người ta không cần tự> con trỏ. Lưu ý rằng không có đối tượng nào có tên str được định nghĩa trong GenericClass gốc. Vì vậy, câu hỏi của tôi là, tại sao là ra khỏi phạm vi khi không được tham chiếu như tự-> str? Mã trong chính nó hoạt động, nhưng tôi không thể đọc biến với trình gỡ lỗi
Đây là cách làm rõ cách GDB hoạt động, cảm ơn! Nhưng có một điều vẫn còn khiến tôi bối rối. Tôi có các biến được xác định trong lớp cha; hãy gọi một siêu cấp NSMutableString *. Một tham chiếu đến "superstr" ngày của riêng mình trong việc thực hiện SpecificClass hoạt động tốt. Nhưng cố gắng truy cập một biến "str" được xác định trong SpecificClass.h không hoạt động trong trình gỡ rối mà không sử dụng self->. GDB tìm thấy biến được kế thừa như thế nào, nhưng không phải một biến được xác định trong tiêu đề của lớp này? Nếu tôi không sử dụng thừa kế, điều này cũng hoạt động tốt. Dường như một lỗi trong XCode –
Thử 'po str' và' po superstr' trong cửa sổ Debugger Console (⇧⌘R). Nếu những người đưa ra kết quả tương tự, vấn đề không liên quan gì đến Xcode (có khả năng). –
Rất kỳ quặc, po str và po superstr làm việc tốt trong giao diện điều khiển, cũng như po self-> str và po self-> superstr. Nó chỉ trong giao diện người dùng gỡ lỗi trực quan, trong đó biến str không có tự báo cáo nằm ngoài phạm vi khi di chuyển qua chuột, nhưng các hoạt động đọc/ghi trong mã hoạt động tốt. Tôi sẽ đăng nhập nó như một lỗi với Apple. Trong khi đó tôi đang sử dụng self-> ở khắp mọi nơi (mặc dù tôi không muốn) để tôi có thể gỡ lỗi trực quan. –