Objective c 在objective c中交换对象
我试图在一个按钮动作上交换两个对象,但无法使其工作。它是第一次交换,但下一次当我点击按钮时,它会因为EXC_BAD_访问而崩溃 这是密码Objective c 在objective c中交换对象,objective-c,xcode,oop,object,ownership,Objective C,Xcode,Oop,Object,Ownership,我试图在一个按钮动作上交换两个对象,但无法使其工作。它是第一次交换,但下一次当我点击按钮时,它会因为EXC_BAD_访问而崩溃 这是密码 -(IBAction)swapLocation { CCLocDTO *tempDto = searchDTO.toDTO; searchDTO.toDTO = searchDTO.fromDTO; searchDTO.fromDTO = tempDto; NSLog(@"From Location is %@",search
-(IBAction)swapLocation
{
CCLocDTO *tempDto = searchDTO.toDTO;
searchDTO.toDTO = searchDTO.fromDTO;
searchDTO.fromDTO = tempDto;
NSLog(@"From Location is %@",searchDTO.fromDTO.streetAddress); //it becomes empty on next button click
NSLog(@"To Location is %@",searchDTO.toDTO.streetAddress);
NSLog(@"From Special Location is %@",searchDTO.fromSpecialDTO.locationName);
NSLog(@"To Special Location is %@",searchDTO.toSpecialDTO.locationName);
[self.tableView reloadData];
}
我正在搜索DTO(searchDTO)中分配fromDTO和ToToTo。如果不使用ARC,则在将
searchDTO.ToToTo
设置为其他对象之前,需要保留tempDto
;否则,旧值可能会被释放,您将在tempDto
中有一个悬空引用。应该是这样的:
CCLocDTO *tempDto = [searchDTO.toDTO retain];
searchDTO.toDTO = searchDTO.fromDTO;
searchDTO.fromDTO = [tempDto autorelease];
CCLocDTO *tempDto = [searchDTO.toDTO retain];
searchDTO.toDTO = searchDTO.fromDTO;
searchDTO.fromDTO = tempDto;
[tempDto release];
或者像这样:
CCLocDTO *tempDto = [searchDTO.toDTO retain];
searchDTO.toDTO = searchDTO.fromDTO;
searchDTO.fromDTO = [tempDto autorelease];
CCLocDTO *tempDto = [searchDTO.toDTO retain];
searchDTO.toDTO = searchDTO.fromDTO;
searchDTO.fromDTO = tempDto;
[tempDto release];
如果不使用ARC,则需要先保留
tempDto
,然后再将searchDTO.toDTO
设置为其他内容;否则,旧值可能会被释放,您将在tempDto
中有一个悬空引用。应该是这样的:
CCLocDTO *tempDto = [searchDTO.toDTO retain];
searchDTO.toDTO = searchDTO.fromDTO;
searchDTO.fromDTO = [tempDto autorelease];
CCLocDTO *tempDto = [searchDTO.toDTO retain];
searchDTO.toDTO = searchDTO.fromDTO;
searchDTO.fromDTO = tempDto;
[tempDto release];
或者像这样:
CCLocDTO *tempDto = [searchDTO.toDTO retain];
searchDTO.toDTO = searchDTO.fromDTO;
searchDTO.fromDTO = [tempDto autorelease];
CCLocDTO *tempDto = [searchDTO.toDTO retain];
searchDTO.toDTO = searchDTO.fromDTO;
searchDTO.fromDTO = tempDto;
[tempDto release];
retain属性的默认getter不是像
return[[bar retain]autorelease]
那样实现的吗?谢谢Tom,你救了我一天。@JustSid不,我很确定它只返回ivar而不涉及retain计数。@TomDalling你是对的,对不起,这只发生在原子属性上!抱歉,当我写这篇文章的时候,我的脑袋还在别的地方。中记录了合成getter的行为。retain属性的默认getter不是像return[[bar retain]autorelease]
那样实现的吗?谢谢Tom,你救了我一天。@JustSid no,我很确定它只返回ivar而不涉及保留计数。@TomDalling你是对的,对不起,这只发生在原子属性上!抱歉,当我写这篇文章的时候,我的脑袋在别的地方。合成getter的行为记录在。