NSCoding 帮助非常奇怪的错误访问解除分配的实例

Posted

技术标签:

【中文标题】NSCoding 帮助非常奇怪的错误访问解除分配的实例【英文标题】:NSCoding help very strange error access to deallocated instance 【发布时间】:2013-07-21 04:09:22 【问题描述】:

在我的代码中,我将我的数组存储在内存中...无需发出 html 请求即可获得它。 第一次,当我填充我的数组时,一切正常......当我从内存中加载数组并将它们加载到表中时,问题就出现了。

这就是类

@interface SubscriptionArray : NSObject
    NSString *title;
    NSString *source;
    NSString *htmlUrl;
    NSInteger count;


@property (nonatomic,retain) NSString *title;
@property (nonatomic,retain) NSString *source;
@property (nonatomic,retain) NSString *htmlUrl;
@property (nonatomic) NSInteger count;
@end


#import "SubscriptionArray.h"

@implementation SubscriptionArray
@synthesize title,source,htmlUrl,count;

-(void)dealloc
    [title release];
    [source release];
    [htmlUrl release];




#pragma mark NSCoding

- (id)initWithCoder:(NSCoder *)decoder 
    if (self = [super init]) 
        title = [[decoder decodeObjectForKey:@"title"] retain];
        source = [[decoder decodeObjectForKey:@"source"] retain];
        htmlUrl = [[decoder decodeObjectForKey:@"htmlUrl"] retain];
        count = [decoder decodeIntegerForKey:@"count"];

    
    return self;


- (void)encodeWithCoder:(NSCoder *)encoder 
    if (title) [encoder encodeObject:title forKey:@"title"];
    if (source) [encoder encodeObject:source forKey:@"source"];
    if (htmlUrl) [encoder encodeObject:htmlUrl forKey:@"htmlUrl"];
    if (count) [encoder encodeInteger:count forKey:@"count"];


数组在委托中声明(与 3 个不同的类共享)

 NSMutableArray *onlySubsriptions; @property(nonatomic, retain)
 NSMutableArray *onlySubsriptions;

我是这样加载的

[onlySubsriptions removeAllObjects];
self.onlySubsriptions = [NSKeyedUnarchiver unarchiveObjectWithFile:fullFileName];

我在 cellForRowAtIndexPath 中收到错误

例如,我确定我有 2 个元素,当它开始加载第一个元素(元素 0)时,cellForRowAtIndexPath 会引发异常......它表示已释放实例。

我确定问题出在编码上,因为我第一次获得数组时一切都很好......只有在下次加载我存储在本地的数组时才会出现问题。

**** 关于 ****** 的更多信息

**** cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";


    TDBadgedCell *cell = [[[TDBadgedCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    SubscriptionArray * element=[[SubscriptionArray alloc]init];
    if (indexPath.section==0) 
        NSLog(@"CASO SPECIALELEMENTS");
        element =[delegate.reader.specialElements objectAtIndex:[indexPath row]];
    
    if (indexPath.section==1) 
        NSLog(@"CASO CATEGORIA");
        element =[delegate.reader.categories objectAtIndex:[indexPath row]];
    
    if (indexPath.section==2) 
        NSLog(@"CASO SUBSCRIPTIONS");
        element =[delegate.reader.onlySubsriptions objectAtIndex:[indexPath row]];
    

【问题讨论】:

使用 'NSZombie` 检查哪个实例被释放 我在我的答案中添加了一些信息...我不明白我的代码有什么问题...你能帮帮我吗? —— 你的 7 行引起了问题,我可以看到部分问题,因为 [SubscriptionsViewController table...] 你能发布这个方法吗? 【参考方案1】:

为了处理这种异常,你可以使用 malloc 工具找出僵尸并修复它。 Product > Profile 将启动 Instruments,然后您应该有一个名为“Malloc”的“Trace Template”。这个question 可能对你有用。

【讨论】:

我在答案中添加了一些信息...我不明白我的代码有什么问题...你能帮帮我吗? 我已经添加了方法的重要部分

以上是关于NSCoding 帮助非常奇怪的错误访问解除分配的实例的主要内容,如果未能解决你的问题,请参考以下文章

如何正确分配和解除分配向量图

将所有 UIAlertView 对象作为全局对象访问以对其进行通用控制(在解除分配视图控制器后解决警报中的 CRASH)

解除分配 pcl::PointCloud<pcl::PointXYZ>::Ptr 时出现分段错误

如何解除分配 CCLayer

类的实例被解除分配,而键值观察者仍向其注册

手机uc解除禁止访问