Tôi có một số câu hỏi về các thuộc tính tổng hợp trong Objective-C. Danh sách đầy đủ sau đây, nhưng câu hỏi cơ bản là: Trình biên dịch đảm bảo rằng các thanh ngang cho các thuộc tính tổng hợp được phát hành đúng cách, mặc dù mã của tôi có thể hoặc không bao gồm các phương thức phát hành trong dealloc?Bản phát hành được xử lý như thế nào đối với các thuộc tính giữ lại @synthesized?
Lưu ý: Tôi quyết định không đăng những câu hỏi này vì chúng liên quan chặt chẽ và vì có một số câu hỏi hiện có mà chạm vào về các sự cố riêng lẻ mà không thực sự quan tâm.
câu hỏi Hơi tương tự:
- Does property retain need a release?
- What's the difference between property and synthesize?
- Question on retain attribute with property and synthesize
Setup: Hãy xem xét một lớp học với một tài sản duy nhất:
@interface Person : NSObject
{
NSString * name;
}
@property (nonatomic, retain) name;
@end
Câu hỏi # 1: Các trường hợp rất cơ bản:
@implementation Person
@synthesize name;
@end
Với thiết lập này, tôi cho rằng name
sẽ tự động phát hành bất cứ khi nào một đối tượng Person
được phát hành. Trong tâm trí của tôi, trình biên dịch chỉ cần chèn [name release]
vào phương thức dealloc
như thể tôi đã tự gõ nó. Đúng không?
Câu hỏi # 2: Nếu tôi chọn để viết phương pháp dealloc
của riêng mình cho lớp này, và tôi bỏ qua một cuộc gọi đến [name release]
, sẽ bị rò rỉ?
@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end
Câu hỏi # 3: Nếu tôi chọn để viết phương pháp dealloc
của riêng mình cho lớp này, và tôi bao gồm một cuộc gọi đến [name release]
, mà sẽ kết quả trong một đúp phát hành, kể từ @synthesize
đã chăm sóc nó cho tôi?
@implementation Person
@synthesize name;
- (void)dealloc { [name release]; [super dealloc]; }
@end
Câu hỏi # 4: Nếu tôi chọn để viết accessor tài sản của riêng mình cho lớp này, nhưng tôi không viết phương pháp dealloc
của riêng tôi, sẽ name
được rò rỉ?
@implementation Person
@dynamic name;
- (void)setName:(NSString *)newName
{
[newName retain];
[name release];
name = newName;
}
@end
Câu hỏi # 5: Tôi có một cảm giác (dựa trên kinh nghiệm) mà none các kịch bản trên sẽ gây ra rò rỉ hoặc đúp phát hành, kể từ khi ngôn ngữ đã được thiết kế để tránh chúng. Điều đó, tất nhiên, đặt ra câu hỏi "làm thế nào?". Trình biên dịch có đủ thông minh để theo dõi mọi trường hợp có thể không? Điều gì nếu tôi được làm những điều sau đây (lưu ý rằng đây là một ví dụ lố bịch, chỉ có nghĩa là để minh họa cho quan điểm của tôi):
void Cleanup(id object) { [object release]; }
@implementation Person
@synthesize name;
- (void)dealloc { Cleanup(name); }
@end
Would rằng đánh lừa trình biên dịch vào thêm [name release]
khác với phương pháp dealloc
?
Cảm ơn bạn đã trả lời chi tiết. Tôi rất vui vì tôi đã hỏi! –
Rất được giải thích! –