Nếu tôi sử dụng malloc cùng với tính năng đếm tham chiếu tự động, tôi có phải tự giải phóng bộ nhớ không?malloc + Tính tham chiếu tự động?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
Nếu tôi sử dụng malloc cùng với tính năng đếm tham chiếu tự động, tôi có phải tự giải phóng bộ nhớ không?malloc + Tính tham chiếu tự động?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
Có, bạn phải tự mã hóa cuộc gọi đến số free
. Tuy nhiên, con trỏ của bạn có thể tham gia vào các tài liệu tham khảo hệ thống đếm gián tiếp nếu bạn đặt nó trong một thể hiện của một đối tượng tài liệu tham khảo-tính:
@interface MyObj : NSObject {
int *buf;
}
@end
@implementation MyObj
-(id)init {
self = [super init];
if (self) {
buf = malloc(100*sizeof(int));
}
}
-(void)dealloc {
free(buf);
}
@end
Không có cách nào xung quanh viết mà gọi để free
- cách này hay cách khác, bạn phải có nó trong mã của bạn.
Có. ARC chỉ áp dụng cho các trường hợp Mục tiêu-C và không áp dụng cho malloc()
và free()
.
những gì về new int [100] ;? –
Không. ARC chỉ xử lý các cá thể Objective-C được tạo với '[ClassName alloc]'. –
Xin lỗi, nhưng bạn có thể cho tôi biết nếu cấu trúc được tạo bởi 'Vertex v;' sẽ được tính là một cá thể Objective-C? –
Trong dealloc thêm một nếu không nil và gán cho nil cho an toàn. Không muốn miễn phí, malloc có thể được sử dụng bên ngoài của init vv
@interface MyObj : NSObject {
int *buf;
}
@end
@implementation MyObj
-(id)init {
self = [super init];
if (self) {
buf = malloc(100*sizeof(int));
}
}
-(void)dealloc {
if(buf != null) {
free(buf);
buf = null;
}
}
@end
Tôi không hiểu tại sao bạn kiểm tra nếu 'buf! = NULL' trong' dealloc'. Thay vào đó, bạn không nên kiểm tra nếu 'buf == NULL' sau' malloc' trong 'init', và nếu có, hãy xử lý lỗi đó? Sau đó, không cần kiểm tra nếu 'buf! = NULL' trong' dealloc', phải không? Ngoài ra, điểm thiết lập 'buf = NULL' ở cuối' dealloc' là gì? Đặc biệt, nếu 'buf' là một biến cá thể riêng, bạn sẽ không phải làm điều gì đó khá lạ trong mã của mình để truy cập' buf' sau khi 'dealloc' được gọi? – ma11hew28
Bạn nói đúng. Lý do duy nhất cho nếu là để tránh gọi miễn phí (null) để tránh một vụ tai nạn. Chỉ cần thử nghiệm, miễn phí (null) không sụp đổ. –
Vậy ARC sẽ gọi dealloc khi nó loại bỏ thể hiện? –
@stas Vâng, không trực tiếp: ARC sẽ gọi '[obj release]' - đó là công việc duy nhất của nó. Chỉ khi phát hành kết quả đếm đếm ngược xuống 0, '[obj dealloc]' được gọi. – dasblinkenlight