Có và không. Cuối cùng, bạn sẽ giải phóng bộ nhớ chuỗi nhưng "rò rỉ" đối tượng NSAutoreleasePool vào bộ nhớ bằng cách sử dụng thoát thay vì phát hành nếu bạn chạy điều này trong môi trường thu gom rác (không được quản lý bộ nhớ). "Rò rỉ" này chỉ đơn giản là làm cho cá thể của NSAutoreleasePool "không thể truy cập" giống như bất kỳ đối tượng nào khác không có con trỏ mạnh trong GC và đối tượng sẽ bị xóa vào lần tiếp theo GC chạy, rất có thể ngay sau lệnh gọi tới -drain
:
cống
Trong môi trường thu gom rác, kích hoạt thu gom rác nếu bộ nhớ được cấp phát kể từ lần thu thập cuối cùng lớn hơn ngưỡng hiện tại; nếu không thì hoạt động như một bản phát hành. ... Trong môi trường thu gom rác, phương thức này cuối cùng sẽ gọi objc_collect_if_needed
.
Nếu không, nó tương tự như cách -release
cư xử của không phải GC, vâng. Như những người khác đã nêu, đó -release
là điều kiện cấm theo GC, vì vậy, cách duy nhất để đảm bảo nhóm hoạt động đúng theo GC là thông qua -drain
và -drain
dưới không phải GC hoạt động chính xác như -release
dưới không phải GC và được cho là truyền đạt chức năng của nó rõ ràng hơn như tốt.
Tôi nên chỉ ra rằng câu lệnh của bạn "bất cứ thứ gì được gọi với new, cert hoặc init" không nên bao gồm "init" (nhưng nên bao gồm "copy"), bởi vì "init" không cấp phát bộ nhớ, nó chỉ thiết lập đối tượng (hàm tạo thời trang). Nếu bạn nhận được một đối tượng cấp phát và hàm của bạn chỉ được gọi là init, bạn sẽ không giải phóng nó:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
Điều đó không tiêu tốn thêm bất kỳ bộ nhớ nào so với bộ nhớ mà bạn đã bắt đầu (giả sử init không khởi tạo các đối tượng, nhưng bạn không chịu trách nhiệm về những điều đó).