问题描述
|
更新:我已经在A的copyWithZone方法中找到了该错误。谢谢大家。
更新:抱歉,我确实声明了@properties,我认为这很明显,因此我在OP中跳过了它们。对于那个很抱歉。
崩溃消息是:尝试访问str时objA已释放(僵尸)内存。
我的数据结构如下所示:
@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没有保留。但是我不知道如何确保他们得到再培训。
任何帮助表示赞赏
-狮子座
解决方法
您应该为A类和B类使用属性:
@interface A : NSObject {
NSString *str;
}
@property (nonatomic,retain) NSString *str;
@end
使用@synthesize str;在.m文件中,这将保留str,不要忘记在dealloc方法中释放str:
@implementation A
@synthesize str;
- (void) dealloc {
[str release],str= nil;
[super dealloc];
}
@end;
,你应该看看
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html%23//apple_ref/doc/uid/TP30001163-CH17
了解属性以及它们如何管理内存。
,你有没有尝试过:
[someMutableArray addObject: [newB copy] ];
,在这条线
someLabel.text = myB.A.str;
它应该是...
someLabel.text = myB.objA.str;
是的,您还应该为类的成员使用属性。那将保留他们。只是不要忘记在dealloc中释放