代码之家  ›  专栏  ›  技术社区  ›  brian.clear

nsarray对超出范围的对象的行为异常

  •  2
  • brian.clear  · 技术社区  · 14 年前

    我有个奇怪的问题 NSArray 如果数组中的某些对象成员超出范围,而不是其他对象:

    我有一个简单的对象叫做section。 它有三个成员。

    @interface Section : NSObject {
        NSNumber *section_Id;   
        NSNumber *routeId;
        NSString *startLocationName;
    }
    @property(nonatomic,retain)  NSNumber *section_Id;  
    @property(nonatomic,retain)  NSNumber *routeId;
    @property(nonatomic,retain)  NSString *startLocationName;
    @end
    
    
    @implementation Section
    
    @synthesize section_Id; 
    @synthesize routeId;
    @synthesize startLocationName;
    
    //Some static finder methods to get list of Sections from the db
    + (NSMutableArray *) findAllSections:{
    
    
    - (void)dealloc {
        [section_Id release];
        [routeId release];
        [startLocationName release];
    
        [super dealloc];
    }
    
    @end
    

    我用一个名为 findAllSection

    self.sections = [Section findAllSections];
    

    在“查找所有部分”中,我创建了一些局部变量,用数据库中的数据填充它们。

    NSNumber *secId = [NSNumber numberWithInt:id_section];
    NSNumber *rteId = [NSNumber numberWithInt:id_route];
    NSString *startName = @"";
    

    然后创建一个新的节并将这些局部变量的数据存储在节中

    Section *section = [[Section alloc] init];
    
    section.section_Id = secId;
    section.routeId = rteId;
    section.startLocationName = startName;
    

    然后我将该部分添加到数组中

    [sectionsArray addObject:section];
    

    然后我清理,释放局部变量和添加到数组中的部分 [安全释放]; [rteid释放]; [开始名称释放]; [本地名称发布];

    [section release];
    

    在循环中对所有部分重复(释放局部变量,在每个循环中完成部分)

    方法返回,我检查数组,所有部分都在那里。我似乎无法深入查看数组中截面对象的值(这可能吗)

    稍后我尝试检索其中一个部分

    我从阵列中得到的

    Section  * section = [self.sections objectAtIndex:row];
    

    然后检查值

    NSLog(@" SECTION SELECTED:%@",section.section_Id);
    

    但是 section.section_Id 坠毁为 剖面图 超出范围。

    我检查了这个部分对象的其他成员,他们没事。 经过一些尝试和错误之后,我发现通过注释成员变量的释放,对象是可以的。

    //[secId release];
    [rteId release];
    [startName release];
    [locEnd_name release];
    
    
    [section release];
    

    我的问题是:

    我收拾好了吗?

    我应该释放添加到数组的对象和函数中的局部变量吗?

    我的交易在部门里可以吗?

    这段代码看起来还好吗?我应该在别处寻找问题所在吗?

    我没有做任何复杂的事情,只是从数据库中填充数组在表单元格中使用它。

    我可以评论这个版本,但我更想知道为什么这样做,如果我不应该这样做。唯一一个 secId 释放在释放中。

    3 回复  |  直到 10 年前
        1
  •  2
  •   Frank Schmitt    14 年前

    我将第二次(第三次)建议阅读内存管理规则。

    tl;dr版本 alloc 调用一个方法 init 在方法名上是你的责任释放。例如:

    NSString *string = [[NSString alloc] initWithFormat:@"%@", someObject];
    

    在这种情况下你必须释放 string . 然而:

    NSString *string = [NSString stringWithFormat:@"%@", someObject];
    

    在这里 一串 是自动释放的。基本上等同于:

    NSString *string = [[[NSString alloc] initWithFormat@"%@", someObject] autorelease];
    

    …意味着下次通过事件循环(这意味着可能在函数返回时),系统将发送 release 给你的信息。苹果称这些为“便利方法”。

    如果你有这样的东西:

    NSString *string = @"foo";
    

    然后 一串 指的是运行时在程序初始化时创建的nsstring实例,在程序终止之前不会超出范围。从未 释放 这些也一样。

    再次,阅读指南并将其标记为书签。但这应该能回答你的直接问题。

        2
  •  4
  •   Barry Wark    14 年前

    你不应该释放 secId , rteId startName . 塞西德 RTEID 是指向 NSNumber 使用返回已自动释放对象的工厂方法创建的实例。静态字符串(即 @"" )不需要释放。你需要重新阅读 Memory Management Programming Guide . 然后再读一遍;-)它将是你的朋友。

        3
  •  3
  •   Chuck    14 年前

    你在释放你不拥有的东西。你应该看看 memory management rules .