Đây là mã tôi đang đề cập đến.Điều gì làm tăng số lượng lưu giữ của đối tượng?
// Person.h
@interface Person : NSObject {
NSString *firstName;
NSString *lastName;
}
@end
// Person.m
@implementation Person
- (id)init {
if (![super init]) return nil;
firstName = @"John";
lastName = @"Doe";
}
@end
// MyClass.m
@implementation MyClass
.....
- (NSArray *)getPeople {
NSMutableArray *array = [[NSMutableArray alloc] init];
int i;
for (i = 0; i < 10; i++) {
Person *p = [[Person alloc] init];
[array addObject:p];
}
return array;
}
.....
@end
Bây giờ, tôi biết không có quản lý bộ nhớ nào đang diễn ra trong mã mẫu này. Điều gì sẽ được yêu cầu?
Trong vòng lặp getPeople, tôi cấp phát một Person (retainCount 1), sau đó thêm nó vào mảng. Số lần giữ lại hiện là 2, phải không? Nếu nó là hai, tôi có nên [p release] 'ing sau khi thêm nó vào mảng, đưa retainCount trở lại xuống 1?
Tôi có đúng là trách nhiệm của người gọi để giải phóng mảng được trả về bằng phương pháp? (Mà cũng sẽ giải phóng bộ nhớ của các cá nhân, và các biến cá thể của chúng, giả định số đếm của chúng là 1).
Tôi đã đọc tài liệu quản lý bộ nhớ của Apple, nhưng tôi đoán những gì tôi không rõ ràng nhất, là những gì tăng một đối tượng giữ lại tính? Tôi nghĩ rằng tôi nắm bắt ý tưởng về trách nhiệm của ai đó là phát hành. Đây là quy tắc cơ bản, theo Apple:
Bạn sở hữu đối tượng nếu bạn tạo một đối tượng có tên bắt đầu bằng “phân bổ” hoặc “mới” hoặc chứa “bản sao” (ví dụ: phân bổ , newObject hoặc mutableCopy) hoặc nếu bạn gửi tin nhắn giữ lại. Bạn chịu trách nhiệm từ bỏ quyền sở hữu đối tượng bạn sở hữu bằng cách sử dụng bản phát hành hoặc tự động phát hành. Bất kỳ lúc nào bạn nhận được một đối tượng, bạn không được giải phóng nó.
Câu của bobDevil "chỉ lo lắng về số lần giữ lại bạn thêm vào mục một cách rõ ràng" khiến nó nhấp cho tôi. Sau khi đọc chính sách Quyền sở hữu tại Apple, về cơ bản, đối tượng/phương thức tạo đối tượng mới, là đối tượng chịu trách nhiệm giải phóng/nó/sở thích trong đó. Điều này có đúng không?
Bây giờ, giả sử tôi là một phương thức nhận một đối tượng và gán nó cho một biến mẫu. Tôi cần phải giữ lại đối tượng nhận được chính xác, vì tôi vẫn còn quan tâm đến nó?
Nếu bất kỳ điều nào trong số này không chính xác, hãy cho tôi biết.
Josh nói rằng NSMutableArray được đánh dấu để tự động phát hiện theo mặc định? –
Bạn phải tự động rõ ràng một đối tượng mà bạn tạo. – mjhoy