iphone应用程序崩溃

iphone应用程序崩溃,iphone,memory,Iphone,Memory,我不熟悉iPhone编程。我创建了一个基于窗口的应用程序。以下是我的代码: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UILabel *myLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 200, 80)]; myLabel

我不熟悉iPhone编程。我创建了一个基于窗口的应用程序。以下是我的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    UILabel *myLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 200, 80)];
    myLabel1.text = @"Prasad";
    NSLog(@"myLabel retain Count: %d\n", [myLabel1 retainCount]);
    [myLabel1 release];
    NSLog(@"myLabel retain Count: %d\n", [myLabel1 retainCount]);
    [window makeKeyAndVisible];
    return YES;
}
问题1。当我释放mylabel1时,release语句后面的NSLog语句仍然将retainCount打印为1,而理想情况下它应该打印为0。此外,应用程序运行完全正常

现在考虑下面的代码:(类似于上面的代码,除了添加一个NSLO语句:NSLog(@“BIGOOOOOOOO内存”);)

现在我的问题是,

1.当我运行上述代码时,应用程序在打印NSLog(@“bingooomemeory Released”)后崩溃;为什么仅仅通过添加NSLog(@“bingooomemeory Released”)语句应用程序就会崩溃,而在第一个代码中应用程序没有崩溃

首先,永远不要看重新计数。它不可靠,受许多内部因素的影响。代码的第二个版本会导致崩溃,因为: 1) 创建标签时,其保留计数为1 2) 释放它,使其保留计数为0 3) 你给它发个信息。因为它的保留计数为0,它已经被释放,所以应用程序崩溃


不知道为什么第一个版本没有崩溃首先,千万不要看retainCount。它不可靠,受许多内部因素的影响。代码的第二个版本会导致崩溃,因为: 1) 创建标签时,其保留计数为1 2) 释放它,使其保留计数为0 3) 你给它发个信息。因为它的保留计数为0,它已经被释放,所以应用程序崩溃


不知道为什么第一个版本没有崩溃,
-retainCount
的文档有以下警告:

重要提示:此方法在调试内存管理问题时通常没有价值。由于任意数量的框架对象可能保留了一个对象以保存对该对象的引用,而同时自动释放池可能保留了一个对象上任意数量的延迟发布,因此您不太可能从该方法中获得有用的信息

而且,正如关于堆栈溢出时保留计数的各种其他答案所说,不要依赖于
-retainCount


也就是说,回答您的问题:

Q1。当我发布mylabel1时,发布语句后面的NSLog语句仍然将retainCount打印为1,而理想情况下,它应该打印为0。

让我们考虑你的对象不是在自动存储池中。如果对象具有retain count 1并接收到

release
消息,则该对象将被释放。减少释放对象的保留计数有什么意义?运行时不会这样做,因为它是一个无意义的操作,因为对象将不再存在

1。当我运行上述代码时,应用程序在打印NSLog(@“bingooomemeory Released”)后崩溃;为什么仅仅通过添加NSLog(@“Bingooo Memeory Released”)语句,应用程序就会崩溃,而在第一个代码中,应用程序不会崩溃。

首先,请注意,由于
myLabel1
不属于其他对象/代码,因此在发送
[myLabel1 release]
时,它将被解除分配。如果您向该解除分配的对象发送更多消息(例如,
[myLabel1 retainCount]
),您的代码可能会崩溃,因此不要这样做


解除分配对象时,该对象占用的内存将标记为可供使用。根据后续的指令,对象先前占用的内存区域可能会被重写,也可能不会被重写。在重写之前,可以引用解除分配的对象—它是一个重影对象,根本不可靠。在您的情况下,添加另一条
NSLog()
指令或其他因素会导致该内存区域被重写。

有关
-retainCount
的文档中有以下警告:

重要提示:此方法在调试内存管理问题时通常没有价值。由于任意数量的框架对象可能保留了一个对象以保存对该对象的引用,而同时自动释放池可能保留了一个对象上任意数量的延迟发布,因此您不太可能从该方法中获得有用的信息

而且,正如关于堆栈溢出时保留计数的各种其他答案所说,不要依赖于
-retainCount


也就是说,回答您的问题:

Q1。当我发布mylabel1时,发布语句后面的NSLog语句仍然将retainCount打印为1,而理想情况下,它应该打印为0。

让我们考虑你的对象不是在自动存储池中。如果对象具有retain count 1并接收到

release
消息,则该对象将被释放。减少释放对象的保留计数有什么意义?运行时不会这样做,因为它是一个无意义的操作,因为对象将不再存在

1。当我运行上述代码时,应用程序在打印NSLog(@“bingooomemeory Released”)后崩溃;为什么仅仅通过添加NSLog(@“Bingooo Memeory Released”)语句,应用程序就会崩溃,而在第一个代码中,应用程序不会崩溃。

首先,请注意,由于
myLabel1
不属于其他对象/代码,因此在发送
[myLabel1 release]
时,它将被解除分配。如果您向该解除分配的对象发送更多消息(例如,
[myLabel1 retainCount]
),您的代码可能会崩溃,因此不要这样做

解除分配对象时,该对象占用的内存将标记为可供使用。根据后续的指令,对象先前占用的内存区域可能会被重写,也可能不会被重写。直到它是rewri
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    UILabel *myLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 200, 80)];
    myLabel1.text = @"Prasad";
    NSLog(@"myLabel retain Count: %d\n", [myLabel1 retainCount]);
    [myLabel1 release];
    NSLog(@"Bingoooooooo Memeory Released");
    NSLog(@"myLabel retain Count: %d\n", [myLabel1 retainCount]);
    [window makeKeyAndVisible];
    return YES;
}