【问题标题】:Stop objects from being deallocated even when it has strong pointers to it阻止对象被释放,即使它有指向它的强指针
【发布时间】: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


【解决方案1】:

您看到的行为是正常的。数组释放其元素,因为它在块的末尾自行释放。您是否期望对象永远不会被释放?

【讨论】:

  • 但是为什么我不能将数组保存在内存中呢?如果我想将它保存在内存中,我应该怎么做?我必须使用员工资产等扩展程序。
  • 答案并不完全正确(或者可能有点误导)。该数组是一个自动释放的对象,因此在程序控制离开@autoreleasepool 的范围时释放。 - 当main() 结束时,系统会简单地回收所有内存(无需调用dealloc)。程序终止时不会发生内存泄漏。
  • 数组保存在内存中,直到你的程序完成。程序结束后,您无法将其“保留”在内存中。但是,尝试对您的阵列做任何事情,您会看到它仍然存在并且您可以对其进行操作。只有在您的指示之后才会被释放。
  • 要保留数组,您必须保留指向它的指针。一旦你退出上面的代码,就没有其他指向employeesArray的指针了,所以你不能引用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多