Objective c 在objective c中交换对象

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

我试图在一个按钮动作上交换两个对象,但无法使其工作。它是第一次交换,但下一次当我点击按钮时,它会因为EXC_BAD_访问而崩溃

这是密码

-(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的行为记录在。