【发布时间】:2014-04-24 09:17:54
【问题描述】:
我有一个员工对象数组。每当我使用 NSLog() 打印它们时,数组都会被记录,但它开始释放员工对象,尽管我没有将对象分配给 nil。 这是我的 Employee.h:
@interface : Employee:NSObject
{
NSMutableArray *assetsarray;
}
@property int ID;
-(void)dealloc;
-(NSString *)description;
Employee.m:
@synthesize ID;
-(void)dealloc
{
NSLog(@"Deallocating Employee %i" , self.ID);
}
-(NSString *)description
{
return [NSString stringWithFormat:@"Employee %i" , self.ID];
}
这是我的 main.m :(请忽略 cmets)
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSMutableArray *employeesarray = [NSMutableArray array];
// NSMutableArray *assetsarray = [NSMutableArray array];
for (int i = 1; i < 11; i++) {
Employee *emp = [[Employee alloc]init];
[emp setID:i];
[employeesarray addObject:emp];
}
//
// for (int j = 1; j<11; j++) {
//
//
// Asset *ass = [[Asset alloc]init];
//
// ass.label = [NSString stringWithFormat:@"Laptop %i" , j];
// ass.resaleValue = j*18;
//
// [assetsarray addObject:ass];
//
// int index = arc4random() % [employeesarray count];
//
//
// [[employeesarray objectAtIndex:index] addAssetsObject:ass];
//
//
// }
NSLog(@"%@" , employeesarray);
}
return 0;
}
这是输出:
2014-03-18 20:45:16.456 Employee[2112:303] (
"Employee 1",
"Employee 2",
"Employee 3",
"Employee 4",
"Employee 5",
"Employee 6",
"Employee 7",
"Employee 8",
"Employee 9",
"Employee 10"
)
2014-03-18 20:45:16.458 Employee[2112:303] Deallocating Employee 1
2014-03-18 20:45:16.458 Employee[2112:303] Deallocating Employee 2
2014-03-18 20:45:16.458 Employee[2112:303] Deallocating Employee 3
2014-03-18 20:45:16.459 Employee[2112:303] Deallocating Employee 4
2014-03-18 20:45:16.459 Employee[2112:303] Deallocating Employee 5
2014-03-18 20:45:16.459 Employee[2112:303] Deallocating Employee 6
2014-03-18 20:45:16.460 Employee[2112:303] Deallocating Employee 7
2014-03-18 20:45:16.460 Employee[2112:303] Deallocating Employee 8
2014-03-18 20:45:16.460 Employee[2112:303] Deallocating Employee 9
2014-03-18 20:45:16.460 Employee[2112:303] Deallocating Employee 10
Program ended with exit code: 0
【问题讨论】:
-
显示更多来自 main.m 的代码,尤其是循环后
employeesarray发生的情况 -
你能用 NSLog 代码显示所有的测试代码吗?
-
您在上面显示的内容似乎完全正常。当
employeesArray超出范围而没有存储在其他地方时,它将被释放。当它被释放时,其中的条目将被释放,因为它们没有其他引用。 -
(注意
NSMutableArray *employeesarray =...声明了一个新指针,与可能具有相同名称的任何更多全局指针分开。此外,[NSMutableArray array]创建了一个自动释放实例,该实例将在它通过时释放在@autorelease块的边界之外。因此,指针都超出了范围,并且对象的固有生命正在结束。除非该对象被另一个强指针引用,否则它将被释放。) -
@HotLicks:“此外,[NSMutableArray 数组] 创建了一个自动释放的实例”这不能保证。但无论哪种方式,数组都会在 autoreleasepool 块结束时被释放。
标签: objective-c automatic-ref-counting dealloc