2010-11-12 29 views
16

Tại sao tính năng này không thể xảy ra lỗi khi lập trình tổng hợp cố gắng giải phóng đối tượng myArray không xác định? Hoặc là các đối tượng thuộc tính tự động được khởi tạo thành nil và tôi không cần phải làm điều này chút nào?Cú pháp chính xác cho phương pháp init Mục tiêu-C

@interface myClass : NSObject { 
    NSArray* myArray; 
} 
@property (nonatomic, retain) NSArray* myArray; 
@end 

@implementation myClass 
@synthesize myArray; 
-(id)init { 
    if (self = [super init]) { 
     self.myArray = nil; 
    } 
    return self; 
} 

... 

Trả lời

12

Như những người khác đã nêu, biến mẫu đã được khởi tạo thành nil.

Ngoài ra, as per Apple's documentation, các biến mẫu phải được đặt trực tiếp trong phương thức init, vì các phương thức getter/setter của một lớp (hoặc phân lớp của chúng) có thể dựa vào một thể hiện được khởi tạo đầy đủ.

+0

Cám ơn một câu trả lời thông tin nhanh chóng và thêm. – eclux

+0

"như các phương thức getter/setter của một lớp (hoặc lớp con của nó) có thể dựa vào một cá thể khởi tạo hoàn toàn" bạn có nguồn gốc này không? Cảm ơn! –

+0

Tôi chắc chắn làm, nó nằm trong tài liệu của Apple. Tôi sẽ chỉnh sửa câu trả lời của mình để bao gồm một tham chiếu. – paulbailey

3

Nó đã được khởi tạo thành nil.

25

Biến mẫu đối tượng trong Mục tiêu-C được khởi tạo thành nil theo mặc định. Hơn nữa, nhắn tin nil được cho phép (không giống như gọi một phương thức trên null trong các ngôn ngữ gọi hàm như Java, C# hoặc C++). Kết quả của một tin nhắn tới số nilnil, số điện thoại này [nil release]; chỉ là nil, không phải ngoại lệ.

Trên một mặt lưu ý, đó là thực hành tốt nhất để chuyển nhượng/gọi biến dụ trực tiếp trong -init-dealloc phương pháp:

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

- (void)dealloc { 
    [myArray release]; 
    [super dealloc]; 
} 
Các vấn đề liên quan