2011-11-25 3 views
7

Tôi mới tham gia ARC và tôi có một đối tượng có một số lớp học nội bộ là thành viên. Trên phương thức init, tôi muốn phân bổ các đối tượng mới cho chúng.Tại sao tôi không thể phân bổ/init - nhận thông báo "Chỉ định đối tượng được giữ lại cho thuộc tính không an toàn"?

ClassA.h

#import "ClassB.h" 
@interface ClassA : NSObject 
@property (assign) ClassB *member; 
@end 

ClassB.h

@interface ClassB : NSObject 
@property (assign) NSString *name; 
@end 

ClassA.m

@synthesize member = _member; 
-(id)init 
{ 
    _member = [[ClassB alloc] init]; 
} 

Nhưng tôi nhận được "Gán đối tượng giữ lại tài sản không an toàn" lỗi. Tôi đã tìm kiếm trên các trang web nội bộ và không thấy thông tin nào khác về cảnh báo cụ thể này. Nó biên dịch, nhưng có một ngoại lệ truy cập xấu thời gian chạy.

+3

Vui lòng đăng tệp .h với biến mẫu của bạn. Mã của bạn ở đây chưa hoàn chỉnh. – futureelite7

+2

Tôi đã có cùng một vấn đề cho đến khi tôi thay đổi thuộc tính "at" (gán) thành thuộc tính "at" (mạnh, nonatomic) –

Trả lời

12

Vấn đề trước mắt là bạn chỉ định đối tượng cho một thành viên được đánh dấu weak, có nghĩa là đối tượng sẽ không có tham chiếu mạnh và sẽ được deallocated ngay lập tức. Sử dụng strong hoặc retain thay vì weak hoặc assign sẽ khắc phục điều đó.

Một vấn đề lớn hơn với phương pháp -init của bạn là nó không gọi số [super init] và không trả lại bất kỳ thứ gì. Tối thiểu, -init của bạn sẽ trông giống như sau:

-(id)init 
{ 
    self = [super init]; 
    if (self != nil) { 
     self.member = [[ClassB alloc] init]; 
    } 
    return self; 
} 
+1

Cảm ơn, tôi đã giữ [super init] ra cho ngắn gọn, nhưng vì lợi ích đầy đủ cho bạn là chính xác. Và cảm ơn cho lời giải thích, biết tôi hiểu tại sao IBOutlets yếu, và các đối tượng thành viên bên ngoài của xib cần phải mạnh mẽ. –