2009-10-14 37 views
5

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

Trả lời

7

GDB không phải là trình biên dịch Objective-C. Trình biên dịch biết về những thứ như phạm vi từ vựng trong các phương thức Objective-C, nhưng GDB thì không. Tuy nhiên, nó hiểu các biến cục bộ.

Trong mục tiêu-C, mọi phương pháp đều có tham số self tiềm ẩn được truyền cho nó khi được gọi. Vì vậy, khi bạn nhìn vào self->str, GDB giải thích rằng nó sẽ giải thích bất kỳ đánh giá biến địa phương nào khác.

Khi bạn cố gắng tự mình đánh giá str, GDB sẽ tìm một biến cục bộ được gọi là str và không tìm thấy biến nào, báo cáo rằng nó không nằm trong phạm vi. Đây không phải là một lỗi; Đây là hành vi mong đợi.

+0

Đâ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 –

+1

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). –

+1

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. –

Các vấn đề liên quan