目标C:内存管理,释放具有多个引用的对象

时间:2013-02-15 09:23:14

标签: objective-c

我想发布经销商中的Car对象。我想知道这样做的正确方法是什么。 NSMutableArray Inventory为特定经销商存储汽车。所以,现在我想向用户呈现删除功能,因此,用户可以使用Vin编号选择汽车并将其删除。但是,如果我试图找到汽车并释放不起作用的参考。我是否需要从Array中删除对象然后释放引用?我对目标c和初始学习阶段都很新。谢谢。

#import "Dealer.h"
#import "Address.h"
#import "PhoneNumber.h"

@implementation Dealer

static NSInteger dealerIdAllocater = 0;

-(id) init{
    self = [super init];
    self.dealerId = ++dealerIdAllocater;
    self.addressList = [[NSMutableArray alloc] init];
    self.inventory = [[NSMutableArray alloc] init];
    return self;
}

@synthesize dealerId, name, addressList, inventory;

-(void)addCarInInventory:(Car*)car{
    [self.inventory addObject: car];
}

-(void)displayAddresses{
    for(Address *address in self.addressList){
        NSLog(@"Street Address: %@", address.streetAddress);
        NSLog(@"City: %@", address.city);
        NSLog(@"State: %@", address.state);
        NSLog(@"Country: %@", address.country);
        for(int i=0; i<[address.phoneNumber count]; i++){
            PhoneNumber *phoneNumber = [address.phoneNumber objectAtIndex:i];
            NSLog(@"Phone Number %i, %@", i, phoneNumber.phoneNumber);
        }
        NSLog(@"--------------");
    }
}

-(void)displayInventory{
    for(Car *car in self.inventory){
        [car displayInformation];
    }
    NSLog(@"--------------");
}

-(Car *)findCarById:(NSString *)vinNumber{
    for(Car *car in self.inventory){
        if ([vinNumber isEqualToString:car.vinNumber]) {
            return car;
        }
    }
    return nil;
}

@end

1 个答案:

答案 0 :(得分:1)

  

我是否需要从Array中删除对象然后释放引用?

是的,NSMutableArray之类的容器在添加到对象时会将对象的保留计数增加1。这是为了确保容器始终保持对对象的有效引用。从容器中删除对象时,保留计数将减1。