我正在开发一个 iPad 应用程序,我在这里遇到了一个非常奇怪的问题。我会尽量解释清楚。
我有一个名为的类TranslationObject
,它包含一个键和一个文本值。我创建了这个类,如下所示:
@interface TranslationObject : NSObject {
NSNumber *_key;
NSString *_value;
}
@property (nonatomic, retain) NSNumber *key;
@property (nonatomic, retain) NSString *value;
- (id) initWithKey:(NSNumber *) key andValue:(NSString *) value;
@end
将来翻译将从 XML 或 DB 中提取,但现在我执行以下操作:
@interface Translation : NSObject {
NSMutableArray *m_extfeat;
}
@property (nonatomic, retain) NSMutableArray *extfeat;
+ (Translation *) getInstance;
- (id) init;
- (NSMutableArray *) getExtFeat;
@end
执行:
@implementation Translation
@synthesize extfeat = m_extfeat;
- (id) init {
self = [super init];
if (self) {
m_extfeat = [[self getExtFeat] retain];
}
return self;
}
- (NSMutableArray *) getExtFeat {
TranslationObject *obj1 = [[[TranslationObject alloc] initWithKey:[NSNumber numberWithInt: 0] andValue:@"Animal house"] autorelease];
.... more items declared ....
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14, obj15, obj16, obj17, nil];
return [array autorelease];
}
@end
这些翻译在 a 中使用UITableViewController
并在方法中被获取viewDidLoad
为:
- (void)viewDidLoad
{
_data = [[Translation getInstance].extfeat retain];
}
我在它的 处使用这些值cellForRowAtIndexPath
,在这里我调用一个方法来配置单元格:
- (void) configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *) indexPath {
TranslationObject *object = (TranslationObject *) [_data objectAtIndex:indexPath.row];
//Crashes here at 13th item:
NSLog("Object key: %@", [object.key stringValue]);
}
正如上面的代码片段所说,奇怪的是,只有当 _data 数组包含超过 12 个项目时,应用程序才会在获取键值时崩溃。因此,如果我只用 12 个或更少的项目填充 _data 变量,我的代码就可以正常工作。如果我添加超过 12 个,应用程序会在获取第 13 个对象后立即崩溃。
所以我启用了 NSZombies,所以当我检查该方法中的第 13 项时,该值仍然很好,但它只是变成 Zombie的键。再一次.. 仅从第 13 条开始!
有谁知道这怎么可能?是否可能存在最大数量的项目可以存储在内存中?第 12 项的内存是否已满?但如果是这样的话,那为什么价值仍然存在。怎么可能只是之前放出来的钥匙?!如何?!
我希望这个解释是有道理的,有人可以对这个案子有所了解.. =/
谢谢!
编辑:这是 TranslationObject 的 initWithKey 方法的实现:
- (id) initWithKey:(NSNumber *) key andValue:(NSString *) value {
self = [super init];
if (self) {
_key = key;
_value = value;
}
回归自我;}