严重的问题在这里...如果我尝试NSLog我的自定义对象的实例变量,我将获得ECX_BAD_ACCESS。在我的ViewController中调用以下函数,payload
保存从URL中提取的字符串数据。
- (void) initVcardWithData:(NSString *)payload {
NSLog(@"1. initVcardWithData");
aVCard = [[vcardItem alloc] initWithPayload:payload];
VCardViewController *aVCardViewController = [[VCardViewController alloc] initWithVCard:aVCard];
[self presentModalViewController:aVCardViewController animated:YES];
[aVCard release];
}
到目前为止一切顺利。 initWithWithVCard函数如下,theVCard
和theVCardN
在@implementation中定义,并在(.h)中设置为@property(非原子,保留)。:
-(id)initWithVCard:(vcardItem *)aVCard {
if(self = [super init]) {
theVCard = [aVCard retain];
theVCardN = [theVCard.PersonName retain];
}
NSLog(@"---- vCardViewController :: initWithVcard :: FirstName: %@", theVCard.PersonName.FirstName);
return self;
}
如果我在theVCardN
内的ViewController aVCardViewController
中访问ViewDidLoad
对象,一切都像魅力一样。我用该对象的数据设置了一些标签。
如果我然后尝试从一个函数中theVCardN
访问实例变量,该函数是从连接到View中的按钮的IBAction调用的,我在调试器控制台上得到一个EXC_BAD_ACCESS错误。尝试从实例变量中提取数据的函数如下:
-(IBAction)addressbookButtonTapped {
NSLog(@"RETAIN COUNT FOR theVCard: %i", [theVCard retainCount]);
NSLog(@"RETAIN COUNT FOR theVCardN: %i", [theVCardN retainCount]);
NSLog(@"Save to Adressbook: %@", theVCardN.FirstName);
//[self dismissModalViewControllerAnimated:YES];
}
在调用NSLog输出“1”之前,theVCardN
的RetainCounter。然后NSLog Line在调试器控制台中返回EXC_BAD_ACCESS。
有什么想法吗?
答案 0 :(得分:1)
retainCount
返回对象的绝对保留计数。实际值将是一个实际细节,通常完全超出您的控制范围,因为系统框架可能在内部执行任何数量的操作,从而导致保留计数以您不期望的方式进行修改。
它对调试毫无用处,而且它们是专门针对追踪这类问题的大量工具。
首先,如果发生崩溃,则会有回溯。发表它。在这种情况下可能不会那个有趣,但是,仍然,总是看向回溯至少确认它正在崩溃你认为它在哪里/如何。
根据发布的证据,听起来theVCardN.FirstName
被设置为垃圾或基础字符串已被过度释放。打开僵尸检测模式,看看是否是这种情况。由于它在FirstName
上崩溃,因此请显示与创建/存储FirstName
相关的代码。
此外,实例变量和方法应始终以小写字母开头; PersonName
应为personName
& FirstName
应为firstName
。
答案 1 :(得分:0)
也许我正在读错代码或误解你的类结构,但看起来你正在记录:
NSLog(@"Save to Adressbook: %@", theVCardN.FirstName);
上面,你说它仍在工作,你正在记录:
theVCard.PersonName.FirstName
你错过了“PersonName”吗?意思是你应该记录:
NSLog(@"Save to Adressbook: %@", theVCardN.PersonName.FirstName);