2012-01-17 19 views
5

Hãy nói rằng tôi có một tài sản mạnh như vậy:Có an toàn khi gán một thuộc tính cho kết quả của bộ khởi tạo tự động phát trong khi sử dụng ARC không?

@interface Foo 
    @property (strong, nonatomic) NSArray *myArray; 
    @end 

Và, trong initializer của tôi, tôi đặt myArray như vậy:

myArray = [NSArray array]; 

là an toàn không? ARC sẽ chăm sóc đúng cách giữ lại myArray cho tôi chứ?

Lý do tôi hỏi là tôi có một dự án trong đó myArray không phải là được giữ lại đúng cách trong trường hợp này và tôi nhận được quyền truy cập bộ nhớ kém trên đường.

Nhưng, nếu tôi sử dụng

myArray = [[NSArray alloc] init]; 

sau đó tất cả là tốt.

+0

Bởi "trong bộ khởi tạo của tôi", bạn có nghĩa là phương thức 'init [With ...]' của lớp học, đúng không? –

+1

Bạn không sử dụng thuộc tính trong nhiệm vụ của mình, bạn đang chỉ định trực tiếp cho trình sao lưu (chính xác trong bộ khởi tạo). Nhưng nó không quan trọng, ARC sẽ giữ lại mảng này một trong hai cách. (Kể từ khi ivar sao lưu cũng phải là __strong) –

Trả lời

7

Có, ARC sẽ tự động giữ lại cho bạn.

Cách suy nghĩ của ARC là: Nếu bạn có một con trỏ mạnh đến một đối tượng, sau đó nó được đảm bảo để ở còn sống. Khi tất cả các con trỏ (tốt, tất cả các con trỏ mạnh) đối tượng sẽ biến mất, đối tượng sẽ chết.

Từ mô tả sự cố của bạn, có vẻ như ARC không được bật đúng cách trong tệp mà bạn đang thực thi mã đó. Bất kể, tôi khuyên bạn nên chạy ứng dụng của mình bằng Công cụ, sử dụng mẫu "Zombies". Điều đó sẽ cho phép bạn xem toàn bộ lịch sử lưu giữ/phát hành của đối tượng đó và bạn sẽ có thể tìm ra nơi mọi thứ đang diễn ra sai.

+0

Tôi chắc chắn đã bật nó. Có lẽ có điều gì đó khác mà tôi đang thiếu trong lớp học của mình ... – jimothy

+0

Tôi đã cập nhật câu trả lời của mình để nói về mẫu "Zombies" trong Nhạc cụ; đó là nơi tôi sẽ đi tiếp theo. –

Các vấn đề liên quan