Giả sử tôi có một lớp xem bảng liệt kê 100 đối tượng Foo. Nó có:Có thể cho nhiều đối tượng giữ lại cùng một đối tượng trong Objective-C/Cocoa không?
@property (nonatomic, retain) NSMutableArray* fooList;
và tôi điền vào nó với Foos như:
self.fooList = [NSMutableArray array]; while (something) { Foo* foo = [[Foo alloc] init]; [fooList addObject:foo]; [foo release]; }
Câu hỏi đầu tiên: vì NSMutableArray được đánh dấu là giữ lại, có nghĩa là tất cả các đối tượng bên trong nó được giữ lại quá? Tôi có chính xác thêm foo và phát hành bản sao cục bộ sau khi nó được thêm vào mảng không? Hoặc tôi đang thiếu một cuộc gọi giữ lại?
Sau đó, nếu người sử dụng chọn một hàng cụ thể trong bảng và tôi muốn hiển thị một cách chi tiết Foo xem tôi gọi:
FooView* localView = [[FooView alloc] initWithFoo:[self.fooList objectAtIndex:indexPath.row]]; [self.navigationController pushViewController:localView animated:YES]; [localView release];
Bây giờ lớp FooView có:
@property (nonatomic, retain) Foo* theFoo;
vì vậy bây giờ cả hai mảng đang nắm giữ Foo đó cũng như FooView. Nhưng điều đó có vẻ ổn chứ? Khi người dùng truy cập nút dealloc ở phía sau sẽ được gọi trên FooView và [theFoo release] sẽ được gọi. Sau đó, một nút quay lại khác là hit và dealloc được gọi trên lớp tableview và [fooList release] được gọi.
Bạn có thể tranh luận rằng lớp FooView nên có:
@property (nonatomic, assign) Foo* theFoo;
vs giữ lại. Nhưng đôi khi lớp FooView được gọi với một Foo không có trong một mảng. Vì vậy, tôi muốn đảm bảo có hai vật thể đang cầm trên cùng một vật thể khác.
Typo: "... và giải phóng đối tượng nội dung của chúng khi đối tượng bộ sưu tập được giải phóng". Đối tượng trong bộ sưu tập không được phát hành cho đến khi bộ sưu tập được * deallocated *. – JeremyP
Cảm ơn, đã sửa. Mặc dù bạn có thể lập luận rằng bằng cách "phát hành", tôi có nghĩa là "bản phát hành cuối cùng, theo đó giữ lại số đếm về 0, điều đó gây nên sự cố": P nhưng chỉ nói dealloc rõ ràng hơn trong ngữ cảnh đó. – Jaanus