2011-07-06 39 views
5

Lưu ý: Thông thường trong một phương pháp dealloc bạn nên phát hành các biến trường hợp đối tượng trực tiếp (chứ không phải là cách gọi một tập accessor và đi qua nilas tham số), như minh họa trong ví dụ này:Thời gian chạy hiện đại là gì?

- (void)dealloc { 
    [property release]; 
    [super dealloc]; 
} 

Nếu bạn đang sử dụng runtime hiện đại và tổng hợp các biến Ví dụ, tuy nhiên, bạn không thể truy cập vào các instance variable trực tiếp, vì vậy bạn phải gọi phương thức accessor:

- (void)dealloc { 
    [self setProperty:nil]; 
    [super dealloc]; 
} 

runtime hiện đại trong iOS phát triển ứng dụng một cách chính xác là gì?

+0

Có thể có liên quan: http://stackoverflow.com/questions/5621139/is-there-any-problem-using-self-property-nil-in-dealloc –

+0

Không có câu trả lời trong bài đăng đó là gì "hiện đại thời gian chạy ". – Pablo

+2

Đó là 'bạn không thể truy cập biến cá thể trực tiếp' bit được sử dụng để trở thành trường hợp với các trình biên dịch cũ hơn. Với trình biên dịch đủ hiện đại, bạn _can_ truy cập biến thể sao lưu được tự động tổng hợp cho một thuộc tính được khai báo. –

Trả lời

10

Có thể truy cập trực tiếp ivar, dưới cùng tên với thuộc tính tổng hợp. Chỉ thị @synthesize tạo ra ivar thay mặt bạn nếu một cái chưa tồn tại, và vì đó là chỉ thị của trình biên dịch, nên ngà có sẵn tại thời gian biên dịch. Xem "Runtime Difference" trong chương Thuộc tính được khai báo của Ngôn ngữ lập trình mục tiêu-C. Như Abizern đã lưu ý trong một nhận xét, bạn cũng có thể chỉ định bất kỳ tên nào bạn thích cho ivar: @synthesize coffee=tea; - tại đây, tea là ivar và coffee thuộc tính.

Để sử dụng ivar, chỉ cần tham khảo nó như bất kỳ biến nào khác mà không sử dụng cú pháp chấm. Sau đây là tất cả hoàn toàn hợp pháp và hoạt động như mong đợi:

@interface Grisby : NSObject {} 
@property (retain) NSObject * obj; 
@end 

@implementation Grisby 

@synthesize obj; 

- (void) dealloc { 
    [obj release], obj = nil; 
    [super dealloc]; 
} 

- (id) init { 
    self = [super init]; 
    if(!self) return nil; 

    obj = [NSObject new]; 

    return self; 
} 

- (NSObject *) obj { 
    return [[obj retain] autorelease]; 
} 

@end 

"Thời gian chạy hiện đại" được giới thiệu với Mac OS X 10.5 (Leopard) như một phần của quá trình chuyển đổi sang 64 bit. Tất cả các phiên bản iOS đều sử dụng thời gian chạy hiện đại. Các biến mẫu được tổng hợp là một tính năng của thời gian chạy hiện đại, như đã lưu ý trong liên kết tôi đã cung cấp ở trên.

Sự khác biệt chính khác, noted in "Runtime Versions and Platforms" của Hướng dẫn lập trình thời gian chạy mục tiêu-C, là các biến mẫu là "không mong manh". Có một lớp indirection được thêm vào lưu trữ và truy cập ivar cho phép các lớp thêm các biến mà không ảnh hưởng đến việc lưu trữ các lớp dẫn xuất. Nó cũng có lẽ tạo điều kiện cho sự tổng hợp biến thể. Greg Parker has an explanation liên quan đến mèo con, có tham chiếu đến nó trong số 2009 runtime writeup của Mike Ash và Bavarious ở đây trên SO có một số swell post về lưu trữ ivar và các phần mở rộng của lớp.

Bạn có thể thấy những thứ khác đã thay đổi, mặc dù không có giải thích, trong chương "Mac OS X Version 10.5 Delta" của tham chiếu thời gian chạy mục tiêu-C.

+0

Thật vậy. Bạn thậm chí có thể thay đổi tên của iVar sao lưu trong '@ synthesize' – Abizern

+1

" Thuộc tính được khai báo là một tính năng của thời gian chạy hiện đại "là không đúng sự thật. Syntarsized ivars là một tính năng của thời gian chạy hiện đại, nhưng bạn có thể sử dụng các thuộc tính khai báo trong cả 32 và 64-bit trên OS X, hàm ý cả hai thời gian chạy. –

+0

@BJ Homer: Cảm ơn ghi chú đó. Tôi đoán đây là một phần của sự nhầm lẫn xung quanh "thời gian chạy hiện đại", các thuộc tính được giới thiệu với ObjC-2.0 và Leopard, cùng lúc với MR. –

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