【问题标题】:the objects inside a NSMutableDictionary are lost during runtime. the pointers are lost somehowNSMutableDictionary 中的对象在运行时丢失。指针不知何故丢失了
【发布时间】:2011-09-21 22:30:16
【问题描述】:

我在一个类中有一个 NSMutableDictionary

@interface ClassName : UITableViewController {
        NSMutableArray *doctors_set;
}

@property (nonatomic, retain)   NSMutableArray *doctors_set;

@implementation ClassName
@synthesize DocID,doctors_set;

我正在添加 4 个对象

DoctorsSet *set = [[DoctorsSet alloc] init];

//DoctorsSet is an extended NSObject

[doctors_set addObject:set];

我想要的是使用同一类中的集合(我正在使用 tableview) 所以当我点击单元格时,我必须恢复所点击索引上的集合

DoctorsSet *set = (DoctorsSet *)[doctors_set objectAtIndex:indexPath.row];

当发生 didSelectRowAtIndexPath 事件时。索引处的集合丢失,我可以在调试器中看到它。索引甚至没有 DoctorsSet 类型..它们被一些随机类型替换,告诉我以某种方式没有保留对象...... 如果我在表格单元格上点击 2.3 次,就会发生这种情况

当我在调试器中分配数组时,我得到

self 
  doctors_set = (_NSARRAYM *) pointerid 4 objects
    0 = (DoctorsSet *) pointerid
    1 = (DoctorsSet *) pointerid
    2 = (DoctorsSet *) pointerid
    3 = (DoctorsSet *) pointerid

当我得到错误时,因为它说选择器不属于对象(那是因为对象本身丢失了)

self 
  doctors_set = (_NSARRAYM *) pointerid 4 objects
    0 = (NSObject *) pointerid
    1 = (NSObject *) pointerid
    2 = (NSCFString *) pointerid
    3 = (UITouchData *) pointerid

【问题讨论】:

  • 你能把你初始化doctors_set的sn-p贴出来吗?
  • 是的,当我从数据库中读取每个医生时,我正在做一段时间...请参阅我对答案 1 的评论,我已将代码粘贴在那里。我可以不要在 cmets 上更好地格式化它......

标签: iphone xcode pointers nsmutablearray retain


【解决方案1】:

您在哪里分配 NSMutableArray 并将其分配给您的 doctor_set 属性?我的猜测是您在分配它时没有保留它。

你可能想做这样的事情:

doctors_set = [[NSMutableArray alloc] init];

如果您展示了如何分配和存储此属性,则应该更容易说明如何修复它。

【讨论】:

  • 在我已经定义了一个从数据库中获取我所有医生和接口的方法...... -(void) readDoctorsFromDatabase; ... @end 实现 .... -(void) readUsedDoctorsFromDatabase { if (doctors_set!=nil) [doctors_set release]; // 初始化医生组数组医生组 = [[NSMutableArray alloc] init]; ......... while (readdoctorsfromdatabase) { //我的 Doctorsset DoctorsSet 自定义初始化程序 *set = [[DoctorsSet alloc] initCustom:data data]; [医生设置添加对象:设置]; } }
  • 我确实在初始化时调用了 readUsedDoctorsFromDatabase 方法 - (void)viewDidLoad { [super viewDidLoad]; [self readUsedDoctorsFromDatabase]; }
  • 您应该编辑您的原始帖子以包含此代码:它会使其更具可读性。
  • 如果您从 viewDidLoad 调用此方法,那么您将在每次卸载和重新加载视图时释放医生集并重新初始化一个新的集。这可能不是你想要发生的。请记住,在应用的生命周期中,视图可能会根据需要多次卸载和重新加载
  • 该数组将在视图的生命周期内遭受修改,例如,如果我输入一个过滤器。我需要释放所有医生数组(有没有其他方法可以做到这一点?而不是调用发布?),我必须重新查询,重新填充数组并重新绘制 tableview..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 2018-04-25
  • 1970-01-01
  • 2019-12-28
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多