iphone初学者:无法找出漏洞在哪里

iphone初学者:无法找出漏洞在哪里,iphone,uiview,uilabel,memory-leaks,instruments,Iphone,Uiview,Uilabel,Memory Leaks,Instruments,我正在尝试一些iphone的开发。为了更好地理解事情,我先不带IB 我成功地构建了一个显示一些文本的基本应用程序。没什么大不了的,直到我用仪器检查过。它向我显示了一些漏洞,我无法理解它们 在此方面的任何帮助都将不胜感激 MyAppDelegate.h @interface MyAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; MyViewController

我正在尝试一些iphone的开发。为了更好地理解事情,我先不带IB

我成功地构建了一个显示一些文本的基本应用程序。没什么大不了的,直到我用仪器检查过。它向我显示了一些漏洞,我无法理解它们

在此方面的任何帮助都将不胜感激

MyAppDelegate.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.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时标记它,释放它,然后稍后,当需要它时,通过它的标记检索它,但它似乎很重。。。