2010-10-18 25 views
12

Sau đây có vẻ đơn giản là đủ. Có một siêu lớp với một ivar và một lớp con truy cập các siêu lớp (@protected) ivar:Tại sao một lớp con @property không có ivar tương ứng ẩn các siêu phân lớp?

// Testclass.h  
@interface TestClass : NSObject { 
    NSString *testIvar; 
} 
@end 

//TestClass.m 
@implementation TestClass 
@end 

//TestSubclass.h 
@interface TestSubClass : TestClass { 
} 

@property (nonatomic, retain) NSString *testProperty; 
- (void) testMethod; 

@end 

//TestSubclass.m  
#import "TestSubClass.h" 
@implementation TestSubClass 

@synthesize testProperty; 

- (void) testMethod{ 
    NSLog(@"The value was: %@", testIvar); 
} 
@end 

Đơn giản và chính xác dường như đủ. Tuy nhiên, cố gắng biên dịch (cho iOS 4.2 SDK, với GCC 4.2) tạo ra lỗi này trỏ đến dòng NSLog: 'testIvar undeclared'.

Tôi mới tham gia Objective-C, nhưng không thể cho cuộc sống của tôi thấy tại sao điều này phải là một lỗi. Bình luận ra các công cụ testProperty, và nó biên dịch OK. Nó có vẻ như thêm một thuộc tính tổng hợp trong một phân lớp, mà không có một ivar tương ứng, thực sự đang ẩn một unclassated superclass ivar.

Có ai có thể khai sáng cho tôi về những gì đang xảy ra ở đây không? Liên quan, là lỗi biên dịch có thể thấy trước? (Nắm bắt nó sẽ giúp tôi tiết kiệm thời gian và thất vọng).

Trả lời

7

LLVM biên dịch nguồn mà không có khiếu nại, chuyển sang LLVM: Chọn mục tiêu → Nhận thông tin → Tạo → C/C++ Trình biên dịch Phiên bản → LLVM 1.5. Từ kinh nghiệm hạn chế của tôi, đó là một trình biên dịch tốt hơn. Không biết tại sao GCC cư xử theo cách của nó - bắt thú vị.

+0

Cảm ơn. Đã có ý nghĩa để thử LLVM anyway, vì vậy đây là dịp. Tôi đã đánh dấu câu trả lời là bạn đã đề xuất sửa chữa, và có lẽ chỉ có các nhà phát triển GNU và/hoặc Apple sẽ biết nguyên nhân thực sự. – Cris

+0

Tôi đã gặp phải sự cố tương tự. Kỳ dị. LLVM ftw – logancautrell

+0

Cũng gặp vấn đề tương tự. Không bao giờ sử dụng LLVM và thấy rằng nó tốt hơn – edo42

1

Lỗi testIvar không khai báo thực sự là cá trích đỏ trong trường hợp này. Thông báo này dường như được gây ra bởi testProperty không có một ivar tương ứng. Để giải quyết vấn đề hoặc khai báo một testProperty ivar trong TestSubClass.h hoặc thực hiện testProperty @dynamic trong TestSubClass.m.

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