Bạn có phải phát hành IBOulets trong dealloc không? Tôi không chắc chắn về điều này bởi vì tôi đã không làm phân bổ và thường bạn chỉ phát hành cho một cái gì đó bạn gọi là cấp phát trên. Có ai biết không?Bạn có phải phát hành IBOulets trong dealloc không?
Trả lời
IBOutlets của bạn có thể là @properties
. Nếu họ đang có, và bạn có retain
như một thuộc tính, sau đó bạn cần để phát hành trong -dealloc
Nói cách khác:
@interface MyViewController : UIViewController {
IBOutlet UITableView *myTable;
}
@property (nonatomic, retain) IBOutlet UITableView *myTable;
@end
Bạn sẽ phải [myTable release];
trong dealloc của bạn.
Nếu bạn thực hiện một Navigation mới dựa trên App trong Xcode, và nhìn vào appdelegate.h:
@interface Untitled1AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UINavigationController *navigationController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@end
và dealloc cho appdelegate.m:
- (void)dealloc {
[navigationController release];
[window release];
[super dealloc];
}
Điều quan trọng để xem dưới đây là các dòng như sau:
@property (nonatomic, retain) IBOutlet UIWindow *window;
Nếu có giữ lại trong đó, điều đó có nghĩa là tài sản đang được " sở hữu "bởi mã của bạn và bạn phải phát hành nó.
Tất nhiên, có những cách khác, chẳng hạn như không khai báo IBOutlets làm thuộc tính hoặc khai báo chúng dưới dạng thuộc tính mà không giữ lại. Tôi thấy rằng trong hầu hết các trường hợp, tôi muốn có chúng được giữ lại tài sản, mà sau đó tôi phải phát hành một cách rõ ràng. Một ví dụ về điều này là khi bạn lật từ bộ điều khiển xem này sang bộ điều khiển khác. Khi một bộ điều khiển xem bị loại bỏ, các chế độ xem của nó bị loại bỏ và chúng được giải phóng. Bất kỳ IBOutlet UILabels trên khung nhìn đó cũng sẽ được giải phóng nếu tôi không giữ chúng lại. Điều đó có nghĩa là khi tôi quay trở lại chế độ xem cũ, tôi phải đi qua và đặt lại nhãn và điều khiển của mình thành giá trị cuối cùng, khi tôi có thể dễ dàng lưu chúng nếu tôi chỉ giữ lại IBOutlet.
Như bạn đã nói, bạn nên giải phóng mọi thứ mà bạn tự phân bổ (với alloc
hoặc copy
). Nó hoạt động theo cách khác: bạn không nên phát hành bất kỳ đối tượng Cocoa nào bạn không phân bổ chính mình (một số hàm CoreFoundation phân bổ và bạn chịu trách nhiệm giải phóng chúng, nhưng nó không phải là trường hợp ở đây).
Nếu bạn không phân bổ IBOutlet, bạn không phải giải phóng nó, trừ khi tất nhiên, vì lý do nào đó, bạn giữ lại nó ở đâu đó.
Cụm từ khóa là ("trừ khi .. bạn đặt lại nó ở đâu đó") sẽ xảy ra nếu bạn sử dụng làm một tài sản (nonatomic, giữ lại). – Fraggle
Nó không phải về IBOutlet, đó là về tuyên bố của bạn. Nếu bạn sử dụng trình hướng dẫn dự án mới trong Xcode, bạn có thể nhận được một số mã như thế này trong tệp tiêu đề của bạn.
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
Bạn có thể thấy, có giữ lại từ khóa trong tệp tiêu đề. Theo hướng dẫn quản lý bộ nhớ, bạn PHẢI phát hành mọi thứ bạn giữ lại (bằng cách gọi cấp phát, sao chép, giữ lại, v.v.). Và bạn có giữ lại trong mã của mình thì bạn phải phát hành nó.
Ngoài ra, trình hướng dẫn đã thêm một số mã phát hành cho bạn.
- (void)dealloc {
[tabBarController release];
[window release];
[super dealloc];
}
Nếu bạn chỉ sử dụng IBOutlet trong giao diện của mình, bạn KHÔNG cần phải giải phóng chúng. Lý do là trừ khi bạn giữ lại chúng một cách rõ ràng trong mã của bạn, chúng chỉ đang được thiết lập. Họ dính xung quanh vì quan điểm là có. Rõ ràng, nếu bạn cũng sử dụng các thuộc tính và giữ lại chúng, bạn cần phải phát hành trên dealloc.
Câu trả lời này không xung đột với câu hỏi trên? Bạn có cần hay không? Thật bôi rôi. – erotsppa
Không, nó không xung đột: "Rõ ràng, nếu bạn cũng sử dụng các thuộc tính và giữ lại chúng, bạn cần phải phát hành trên dealloc". – mahboudz
Là một thử nghiệm, hãy tạo một ứng dụng Nav Based mới trong Xcode. Bạn sẽ thấy cách họ phát hành IBOutlets trong dealloc của họ. – mahboudz
Dưới đây là những gì tôi đã và đang làm đối với IBOutlet
đối tượng (kết hợp với một tập tin NIB) với:
@interface MyViewController : UIViewController {
UILabel *label;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
@end
@implementation MyViewController
@synthesize label;
- (void)setView:(UIView *)aView {
if (!aView) {
// view is being set to nil
// set outlets to nil to get the benefit of the didReceiveMemoryWarning!
self.label = nil;
}
// Invoke super's implementation last
[super setView:aView];
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.label = nil;
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)dealloc {
[label release];
[super dealloc];
}
Side câu hỏi: Liệu nó có ý nghĩa hơn để sử dụng self.label = nil
trong dealloc, hoặc phải release
được một cách rõ ràng được gọi là (ví dụ, để giữ cho máy phân tích tĩnh hạnh phúc)?
Tôi cho rằng, tại thời điểm đó, chúng tôi vẫn đang trên đường thoát, vì vậy không cần thiết lập các đối tượng IBOutlet của chúng tôi thành không.
Nếu đây là BlahViewController.h của bạn:
// BlahViewController.h
#import <UIKit/UIKit.h>
@interface BlahViewController
{
IBOutlet UINavigationBar *navigationBar;
}
@property (nonatomic, retain) IBOutlet UINavigationBar *navigationBar;
@end
Sau đó, đây sẽ là dealloc
của bạn trong BlahViewController.m:
- (void)dealloc
{
[navigationBar release];
[super dealloc];
}
Tuy nhiên, nếu đây là BlahViewController.h của bạn:
// BlahViewController.h
#import <UIKit/UIKit.h>
@interface BlahViewController
{
IBOutlet UINavigationBar *navigationBar;
}
@end
Sau đó, đây sẽ là dealloc
trong BlahViewC của bạn ontroller.m:
- (void)dealloc
{
[super dealloc];
}
Và cuối cùng, nếu đây là BlahViewController.h của bạn:
// BlahViewController.h
#import <UIKit/UIKit.h>
@interface BlahViewController
{
IBOutlet UINavigationBar *navigationBar;
IBOutlet MKMapView *map;
}
@property (nonatomic, retain) IBOutlet UINavigationBar *navigationBar;
@end
Sau đó, điều này sẽ là của bạn dealloc
trong BlahViewController.m:
- (void)dealloc
{
[navigationBar release];
[super dealloc];
}
Nói tóm lại, nếu bạn khai báo nó là tài sản, với retain
, thì bạn cần phải giải phóng nó.
Để trả lời câu hỏi phụ của Joe D'Andrea. Bạn có thể sử dụng self.label = nil;
. Bởi vì nó được gọi setLabel, được tự động tạo:
- (void)setLabel:(UILabel *)input
{
[label autorelease];
label = [input retain];
}
Như bạn có thể thấy hiện nay label
sẽ được phát hành sau đó nil
được gán cho nhãn hiệu này.
Nhưng hãy đảm bảo bạn không viết nó là label = nil
. Rằng sẽ không làm việc. Vì bạn cần phải gọi phương thức truy nhập nhãn được tạo tự động.
- 1. Phát hành, Dealloc và tham chiếu Tự
- 2. khác biệt giữa phát hành và dealloc trong Objective-C
- 3. Tôi có chịu trách nhiệm phát hành cử chỉ của UIViewRecognizers trong dealloc không?
- 4. Bạn có phải triển khai tệp .pdb có biên dịch trong bản phát hành không?
- 5. Thuộc tính trong dealloc: phát hành sau đó thiết lập để nil? hoặc chỉ đơn giản là phát hành
- 6. phát hành mọi thứ bạn có @prontty @synthesize cho?
- 7. Sự khác nhau giữa miễn phí, dealloc, phát hành và tự động phát hành là gì?
- 8. Maven phát hành: chuẩn bị: Không thể chuẩn bị phát hành bởi vì bạn phải thay đổi địa phương
- 9. ARC có phát hành bộ nhớ malloc'ed cho bạn không?
- 10. sự khác biệt giữa cống, phát hành, dealloc và giữ lại trong Objective-C/
- 11. Làm thế nào để bạn phát hành bộ nhớ trong xcode 4.2?
- 12. Bạn có cần phát hành hàng đợi GCD trong ARC trong iOS 6.0 không?
- 13. dealloc trong mục tiêu C
- 14. Có phải viewDidUnload và dealloc luôn được gọi khi rách xuống UIViewController không?
- 15. dealloc, sử dụng bản phát hành hoặc đặt thành nil cho thuộc tính?
- 16. Cài đặt IBOutlets để nil trong dealloc
- 17. Phát triển hệ điều hành không phải là x86
- 18. Có phải LINQ to NHibernate trong bản phát hành Alpha 2.1 không?
- 19. sự khác biệt giữa thiết lập một đối tượng để nil vs gửi nó nhắn phát hành trong dealloc
- 20. removeObserver: forKeyPath: trong dealloc
- 21. Bạn có thể phát hiện Mac Spaces trong Java không?
- 22. Phát hành gói python - bạn có nên bao gồm tài liệu và kiểm tra không?
- 23. Tôi có cần phải phát hành trình nhận dạng cử chỉ không?
- 24. Là một NSString bằng chữ được tự động phát hành hay không cần phải được phát hành?
- 25. UIButton - chúng ta có nên phát hành hay không?
- 26. Phát hành JavaFX 1.0. Quan điểm của bạn là gì?
- 27. Video của bạn không phát trong iOS6
- 28. Làm thế nào bạn có thể có được argv [0] (không phải sys.argv [0]) của hệ điều hành bằng Python?
- 29. Do .pdbs có làm chậm ứng dụng phát hành không?
- 30. phát hành/autorelease nhầm lẫn trong ca cao cho iphone
Nhân bản: http://stackoverflow.com/questions/61838/do-i-need-to-release-xib-resources – Casebash