wil*_*ang 0 objective-c retaincount
我们都知道retain方法会为+1 retainCount,释放时会保留-1 retainCount,如果retainCount == 0,则对象dealloc.但是我遇到了一个问题,下面的代码运行得到了荒谬的结果
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic, retain) NSString *name;
@property(nonatomic, assign) NSInteger age;
@end
@implementation Person
- (id)init
{
self = [super init];
if (self) {
self.name = @"name";
self.age = 20;
}
return self;
}
- (void)dealloc
{
NSLog(@"dealloc");
[super dealloc];
}
@end
int main(int argc, const char * argv[])
{
Person *per1 = [[Person alloc] init];
NSLog(@"retainCount = %lu -- 1",[per1 retainCount]);
[per1 release];
[per1 retain];
NSLog(@"retainCount = %lu -- 2",[per1 retainCount]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
2014-01-11 21:56:23.887 blockTest[1287:303] retainCount = 1 -- 1
2014-01-11 21:56:23.889 blockTest[1287:303] dealloc
2014-01-11 21:56:23.889 blockTest[1287:303] retainCount = 2 -- 2
Run Code Online (Sandbox Code Playgroud)
我不使用ARC.为什么我得到这个结果?应用程序不应该崩溃吗?
这里发生的事情是,虽然对象已经被释放,但是存储它的内存还没有被覆盖,所以后来的调用仍然有效,因为数据暂时仍在那里.
最后得到retainCount2 的原因是,当你发送release到1的对象时retainCount,他们只是dealloc直接对象,而不必费心将内部计数减少到零.
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |