【问题标题】:Could there be an issue with the max. memory capacity? Or why is this variable partly released?最大可能有问题。内存容量?或者为什么这个变量会部分释放?
【发布时间】:2011-07-22 19:49:04
【问题描述】:

我正在开发一个 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

这些翻译在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]);
}

正如上面的 sn-p 所说,奇怪的是,应用程序在获取键值时崩溃只有当 _data 数组包含超过 12 个项目时。因此,如果我只用 12 个或更少的项目填充 _data 变量,我的代码就可以正常工作。如果我添加超过 12 个,应用程序在获取第 13 个对象后立即崩溃。

所以我启用了 NSZombies,所以当我检查该方法中的第 13 项时,value 仍然可以,但只有 key 变成了 Zombie。再说一遍.. 仅从第 13 条开始!

有谁知道这怎么可能?是否可能有最大数量的项目可以存储在内存中?第 12 项的内存是否已满?但如果是这样的话,那为什么价值还在那里。怎么可能只是之前发布的key?!怎么样?!

我希望这个解释是有道理的,并且有人可以对这个案例有所了解.. =/

谢谢!

编辑:这是 TranslationObject 的 initWithKey 方法的实现:

- (id) initWithKey:(NSNumber *) key andValue:(NSString *) value {

    self = [super init];

    if (self) {
        _key = key;
        _value = value;
    }

返回自我; }

【问题讨论】:

  • 你能发布TranslationObjectinitWithKey:andValue:实现吗?
  • 请发-[TranslationObject initWithKey:andValue:]的代码。那里可能存在内存管理问题。
  • TranslationObject 的 init 方法是什么样的——这很重要
  • 我编辑了我的帖子并添加了 initWithKey 实现...感谢您的帮助。

标签: objective-c memory max capacity


【解决方案1】:

确保您使用TranslationObject 中的属性访问器或保留编号:

@implementation TranslationObject

@synthesize key=_key, value=_value;

- (id) initWithKey:(NSNumber *) key andValue:(NSString *) value {
    self = [super init];
    if (!self) return nil;

    self.key = key;  // ensures key is retained
    self.value = value;

    return self;
}

…

@end

具体说明:

self.key = key;

是调用属性访问器方法的语法;在这种情况下,设置访问器。假设您使用 nonatomicretain 属性声明了您的属性,如下所示:

@property (nonatomic, retain) NSNumber *key;

set 访问器看起来像

- (void)setKey:(NSNumber *)value {
    if (value != _key) {
        id old = _key;
        [value retain];
        _key = value
        [old release];
    }
}

set 访问器在你添加时由编译器自动生成:

@synthesize key=_key;

相反,调用

_key = key;

只是简单地将key中的指针值复制到_key,但不复制retainkey所引用的对象。 TranslationObject 不承担密钥的所有权。如果你不想使用访问器,正确的实现应该是

_key = [key retain];

【讨论】:

  • 我不知道怎么写 self.key = key 而不是 _key = key 解决了这个问题!你能解释一下两者的区别吗?因为我想说我也在我的代码中分配了我的局部变量... =/ 谢谢!
  • self.key 使用属性访问器来分配key 的值; _key = key 只是将指针从key 复制到_key,但不转移所有权。
猜你喜欢
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 2015-05-15
  • 2011-10-27
  • 1970-01-01
相关资源
最近更新 更多