iphone初学者:无法找出漏洞在哪里
我正在尝试一些iphone的开发。为了更好地理解事情,我先不带IB 我成功地构建了一个显示一些文本的基本应用程序。没什么大不了的,直到我用仪器检查过。它向我显示了一些漏洞,我无法理解它们 在此方面的任何帮助都将不胜感激 MyAppDelegate.hiphone初学者:无法找出漏洞在哪里,iphone,uiview,uilabel,memory-leaks,instruments,Iphone,Uiview,Uilabel,Memory Leaks,Instruments,我正在尝试一些iphone的开发。为了更好地理解事情,我先不带IB 我成功地构建了一个显示一些文本的基本应用程序。没什么大不了的,直到我用仪器检查过。它向我显示了一些漏洞,我无法理解它们 在此方面的任何帮助都将不胜感激 MyAppDelegate.h @interface MyAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; MyViewController
@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
MyViewController *viewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) MyViewController *viewController;
@end
@interface MyViewController : UIViewController {
UILabel *firstMessage;
}
MyViewController.h
@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
MyViewController *viewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) MyViewController *viewController;
@end
@interface MyViewController : UIViewController {
UILabel *firstMessage;
}
MyViewController.m
@implementation MyAppDelegate
@synthesize window;
@synthesize viewController;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// NEXT LINE LEAKS
[window addSubview:viewController.view];
[window makeKeyAndVisible];
}
- (void)dealloc {
[viewController release];
[window release];
[super dealloc];
}
@end
-(void)loadView {
// Background
CGRect mainFrame = [[UIScreen mainScreen] applicationFrame];
UIView *contentView = [[UIView alloc] initWithFrame:mainFrame];
contentView.backgroundColor = [UIColor blackColor];
self.view = contentView;
[contentView release];
// Add UILabel
// NEXT LINE LEAKS
firstMessage = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 30)];
firstMessage.font = [UIFont fontWithName:@"Helvetica" size:16];
firstMessage.textColor = [UIColor whiteColor];
firstMessage.backgroundColor = [UIColor blackColor];
[self.view addSubview:firstMessage];
[firstMessage release];
}
-(void) viewDidLoad {
NSString * msg;
msg=[[NSString alloc] initWithFormat:@"stuff here"];
firstMessage.text=msg;
[msg release];
}
-(void)dealloc {
[firstMessage release];
[super dealloc];
}
尽量不要在loadView中发布第一条消息。仅在控制器的解除锁定方法中释放它。尽量不要在loadView中释放第一条消息。仅在控制器的dealloc方法中释放它。尝试在标头中使用
@property(非原子,保留)UILabel*firstMessage
,在实现中使用@合成firstMessage
,然后在dealloc方法中释放firstMessage对象。尝试使用@property(非原子,保留)UILabel*firstMessage
在标题中,在实现中合成firstMessage,然后在dealloc方法中释放firstMessage对象。viewcontrollers dealloc中有什么?此代码中没有泄漏。可能是你没有发布的代码的其他部分泄漏了。顺便说一句,MyViewController*viewController;在声明和@property中(非原子,保留)BouncersViewController*viewController;在财产方面。更正这个。好的,修复了这个。我真的注释掉了所有其他代码,所以它真的没有做更多的事情。尽管如此,我还是会用上面写的内容建立一个新项目,并通过仪器再次运行它。看起来很傻,我真的不应该担心它(它很有效),但我想如果我不理解它,我就没有机会找出真正复杂的漏洞。添加了dealloc方法现在您过度发布了第一条消息,因为您将对象添加到了子视图,当视图消失时,您的第一条消息将被释放,这样您就不必在DealLocal中再次释放它ViewController中有什么DealLocal?此代码中没有泄漏。可能是你没有发布的代码的其他部分泄漏了。顺便说一句,MyViewController*viewController;在声明和@property中(非原子,保留)BouncersViewController*viewController;在财产方面。更正这个。好的,修复了这个。我真的注释掉了所有其他代码,所以它真的没有做更多的事情。尽管如此,我还是会用上面写的内容建立一个新项目,并通过仪器再次运行它。看起来很傻,我真的不应该担心它(它很有效),但我想如果我不理解它,我就没有机会找出真正复杂的漏洞。添加了dealloc方法现在您过度发布了第一条消息,因为您将对象添加到了子视图,当视图消失时,您的第一条消息将被释放,这样您就不必在DealLocal中再次释放它。如果出现内存警告,那么它肯定会泄漏。该代码中没有泄漏。我担心您的代码,因为您的控制器在loadView中发布第一条消息,但期望它出现在viewDidLoad中。那又怎样?保留计数为1。当该标签从superview中删除时,它将被正确地释放。如果它有效,那就太好了。在我看来,你只是在过早地释放自己。但我可能错了。关于迪米特里的评论:我同意,在LoadView中发布第一条消息让我感到不舒服。但我觉得有点被迫这样做,因为我在网上找到了所有的例子:-)。不管怎样,释放与否似乎并不影响仪器检测到的泄漏。但是,我真正的问题是:这是操纵UILabel的好方法吗?我找到了其他方法,比如在创建UILabel时标记它,释放它,然后稍后,当需要它时,通过它的标记检索它,但是它看起来很重……如果出现内存警告,那么它肯定会泄漏。该代码中没有泄漏。我担心您的代码,因为您的控制器在loadView中发布第一条消息,但期望它出现在viewDidLoad中。那又怎样?保留计数为1。当该标签从superview中删除时,它将被正确地释放。如果它有效,那就太好了。在我看来,你只是在过早地释放自己。但我可能错了。关于迪米特里的评论:我同意,在LoadView中发布第一条消息让我感到不舒服。但我觉得有点被迫这样做,因为我在网上找到了所有的例子:-)。不管怎样,释放与否似乎并不影响仪器检测到的泄漏。但是,我真正的问题是:这是操纵UILabel的好方法吗?我找到了其他方法,比如在创建UILabel时标记它,释放它,然后稍后,当需要它时,通过它的标记检索它,但它似乎很重。。。