Iphone发布问题

Iphone发布问题,iphone,memory-management,Iphone,Memory Management,我在a.h中有以下代码 @property (nonatomic, copy) NSString *username; 然后,当用户在文本字段中输入文本时,用户名以这种方式分配: self.username = textField.text; 然后,在dealloc方法中,我调用release: NSLog(@"%d",[username retainCount]); [username release]; NSLog(@"%d",[username retainCount]); 但在控制

我在a.h中有以下代码

@property (nonatomic, copy) NSString *username;
然后,当用户在文本字段中输入文本时,用户名以这种方式分配:

self.username = textField.text;
然后,在dealloc方法中,我调用release:

NSLog(@"%d",[username retainCount]);
[username release];
NSLog(@"%d",[username retainCount]);
但在控制台中,它会打印:

2011-01-11 23:09:52.468 IApp[2527:307]1 2011-01-11 23:09:52.480 IApp[2527:307]1

有什么问题


感谢

在释放后,对象被销毁,因此第二次调用“retaincount”具有未定义的行为

在释放后,对象被销毁,因此第二次调用“retaincount”具有未定义的行为

当您第一次释放时,保留计数为1。由于内存即将被释放,因此不需要减少retain计数,因此底层代码可以跳过减量步骤并释放内存


当您第二次查看retain计数时,您看到的是释放内存,这是不安全的,可能会返回任何值。由于它是在释放后立即释放的,内存可能没有分配给其他对象,但无论如何都不应该访问它。

当您第一次释放时,保留计数为1。由于内存即将被释放,因此不需要减少retain计数,因此底层代码可以跳过减量步骤并释放内存


当您第二次查看retain计数时,您看到的是释放内存,这是不安全的,可能会返回任何值。由于它是在释放后立即释放的,内存可能没有分配给其他对象,但无论如何都不应该访问它。

对象不会立即释放。在真正释放对象之前,可能必须有一个运行循环周期。 然而,调用retainCount实际上是一件卑鄙的事情。请阅读原因:

编辑:@kris van bael对这个答案的评论是正确的,根据文档,这是不正确的。所以我必须明确指出,我在这里写的是基于在iOS模拟器上测试这个问题——而不是它应该如何工作。但是,以下代码似乎不会出错:

@interface Test : NSObject { }
@property (retain, nonatomic) NSString *test;
@end

@implementation Test
@synthesize test;
@end
然后在代码的某个地方编写:

Test* t = [[Test alloc] init];
t.test = @"Test1";

NSLog(@"%@", t.test);

[t release];

t.test = @"Test2";

NSLog(@"%@", t.test);    

不幸的是,在iOS模拟器上运行时不会出现错误,但是在调试器中一步一步地执行它会崩溃,因此在iOS中释放对象显然有一些技巧。

对象不会立即释放。在真正释放对象之前,可能必须有一个运行循环周期。 然而,调用retainCount实际上是一件卑鄙的事情。请阅读原因:

编辑:@kris van bael对这个答案的评论是正确的,根据文档,这是不正确的。所以我必须明确指出,我在这里写的是基于在iOS模拟器上测试这个问题——而不是它应该如何工作。但是,以下代码似乎不会出错:

@interface Test : NSObject { }
@property (retain, nonatomic) NSString *test;
@end

@implementation Test
@synthesize test;
@end
然后在代码的某个地方编写:

Test* t = [[Test alloc] init];
t.test = @"Test1";

NSLog(@"%@", t.test);

[t release];

t.test = @"Test2";

NSLog(@"%@", t.test);    
不幸的是,在iOS模拟器上运行时不会出错,但在调试程序中一步一步地执行它会崩溃,所以在iOS中释放对象显然有一些技巧

有什么问题

问题是,您正在使用retainCount并期望得到有意义的结果

不要调用重新计数 上面有一些很好的细节。这里的一个答案是:

注意,您可以设置MallocScribble环境变量,这将导致分配的内存在分配时填充0xaa字节,在释放时填充0x55字节。在这种情况下,您第二次重新登录的调用将崩溃

有什么问题

问题是,您正在使用retainCount并期望得到有意义的结果

不要调用重新计数 上面有一些很好的细节。这里的一个答案是:


注意,您可以设置MallocScribble环境变量,这将导致分配的内存在分配时填充0xaa字节,在释放时填充0x55字节。在这种情况下,您第二次调用retainCount将崩溃。

这是错误的,“autorelease”将被推迟到“事件处理”结束,但“release”将立即执行。是的。这就是理论,在所有情况下都应该如此。然而,我刚刚创建了一个在模拟器中测试的小iOS应用程序,在发布了我的测试类实例之后,我仍然能够获得我的属性值。似乎框架在调用dealloc时有所延迟。。。如果你一步一步地执行这个程序,你会得到一个正确的坏访问,尽管试一下。。。立即释放。问题是dealloc之后的行为是未定义的。系统不会浪费周期在释放的内存上涂鸦,因此,未定义可能意味着仍然是半可行的。@bbum-那么你是说内存被释放了,但没有改变内存位置?这也可能是一个答案…@Moszi-仅仅因为tho
se属性看起来没有更改并不表示内存尚未释放。取消分配不会清除内存,它只是使其再次可供分配。读取这些属性就是访问可能已经分配和覆盖的内存。仅仅因为它在程序的一次特定运行期间没有被重新分配和覆盖,并不意味着它不会是下一次,特别是在内存不足的情况下。它的俄罗斯轮盘赌…这是不正确的,“自动释放”被推迟到“事件处理结束”,但“释放”被立即执行。是的。这就是理论,在所有情况下都应该如此。然而,我刚刚创建了一个在模拟器中测试的小iOS应用程序,在发布了我的测试类实例之后,我仍然能够获得我的属性值。似乎框架在调用dealloc时有所延迟。。。如果你一步一步地执行这个程序,你会得到一个正确的坏访问,尽管试一下。。。立即释放。问题是dealloc之后的行为是未定义的。系统不会浪费周期在释放的内存上涂鸦,因此,未定义可能意味着仍然是半可行的。@bbum-那么你是说内存被释放了,但没有改变内存位置?这也可能是一个答案…@Moszi-仅仅因为这些属性看起来没有改变并不意味着内存没有被释放。取消分配不会清除内存,它只是使其再次可供分配。读取这些属性就是访问可能已经分配和覆盖的内存。仅仅因为它在程序的一次特定运行期间没有被重新分配和覆盖,并不意味着它不会是下一次,特别是在内存不足的情况下。俄罗斯轮盘赌。。。