2011-05-23 65 views
0

更新:我在A中找到了我的copyWithZone方法中的错误。谢谢大家。插入到可变数组时如何保留这个对象?

更新:抱歉,我确实声明了@properties,我认为这很明显,所以我在OP中跳过了它们。对于那个很抱歉。

崩溃消息是:objA在尝试访问str时释放(僵尸)内存。


我的数据结构是这样的:

@class A 
{ 
    NSString *str; 
} 
@property (retain) NSString *str; // str synthesized in .m 


@class B 
{ 
    A *objA; 
} 
@property (copy) A *objA; // objA synthesized in .m 

我所试图做的是:

B *newB = [[B alloc] init]; 
[someMutableArray addObject: newB]; 

不过,我会崩溃有时当我试图像这样访问:

B *myB = [someMutableArray objectAtIndex: index]; 

someLabel.text = myB.objA.str; 

将B插入数组时,我猜objA & objA.str未被保留。但我不知道如何确保他们正在接受再培训。

任何帮助理解

-Leo

+1

你可以发布代码创建A的实例吗? – 2011-05-23 07:50:35

+1

B类和A类的init方法是否定义良好?你能粘贴崩溃日志吗? – 2011-05-23 07:51:00

回答

3

您应该使用A类和属性B:

@interface A : NSObject { 
    NSString *str; 
} 

@property (nonatomic, retain) NSString *str; 
@end 

使用@synthesize STR;在.m文件,这将保留海峡,不要忘记释放在STR中dealloc方法:

@implementation A 

@synthesize str; 

- (void) dealloc { 
    [str release], str= nil; 
    [super dealloc]; 
} 

@end; 
0

你试过:

[someMutableArray addObject: [newB copy] ]; 
+0

您不应该使用副本来解决内存管理问题。 – kball 2011-05-23 08:02:55

0

在这条线

someLabel.text = myB.A.str; 

应该...

someLabel.text = myB.objA.str; 

是的,你也应该使用属性的成员你的班。这将保留它们。只是不要忘记发布dealloc

+0

是的,这是我刚刚修复的一个错字。 – leo 2011-05-23 08:17:33

+0

好吧,你现在尝试使用属性? – jcpennypincher 2011-05-23 09:07:43

相关问题