2013-05-12 4 views
-2

Я использую последний xcode. Файл реализация: SimpleCar.m:Объективные методы C [сделать выпуск] выпуск

#import "SimpleCar.h" 

@implementation SimpleCar 


// set methods 
- (void) setVin: (NSNumber*)newVin { 
[vin release]; 
vin = [[NSNumber alloc] init]; 
vin = newVin; 
} 
- (void) setMake: (NSString*)newMake { 
[make release]; 
make = [[NSString alloc] initWithString:newMake]; 
} 
- (void) setModel: (NSString*)newModel { 
[model release]; 
model = [[NSString alloc] initWithString:newModel]; 
} 
// convenience method 
- (void) setMake: (NSString*)newMake 
    andModel: (NSString*)newModel { 
// Reuse our methods from earlier 
[self setMake:newMake]; 
[self setModel:newModel]; 
} 

//get methods 
- (NSString*) make; { 
return make; 
} 
- (NSString*) model;{ 
return model; 
} 
- (NSNumber*) vin;{ 
return vin; 
} 

-(void) dealloc 
{ 
[vin release]; 
[make release]; 
[model release]; 
[super dealloc]; 
} 
@end 

интерфейс файла: SimpleCar.h:

#import <Foundation/Foundation.h> 

@interface SimpleCar : NSObject { 
NSString* make; 
NSString* model; 
NSNumber* vin; 

} 
// set methods 
- (void) setVin: (NSNumber*)newVin; 
- (void) setMake: (NSString*)newMake; 
- (void) setModel: (NSString*)newModel; 
// convenience method 
- (void) setMake: (NSString*)newMake 
    andModel: (NSString*)newModel; 
// get methods 
- (NSString*) make; 
- (NSString*) model; 
- (NSNumber*) vin; 

@end 

Я получаю сообщение об ошибке в файле реализации, когда я типа «[Vin релиз], [модель release], [сделать выпуск] ", и я не могу запустить программу.

+3

Это не только не связано с Xcode, но и не имеет всех исследований. Если вы google сообщение об ошибке (которое я предполагаю, это «ARC запрещает явный вызов для выпуска»), вы получите несколько десятков ответивших SO-вопросов. – 2013-05-12 20:32:17

+0

Кроме того, сеттеры выполнены неправильно. – yinkou

+3

Куда бы вы не получили этот код, выбросьте источник и не смотрите на него снова. Мало того, что все сеттеры реализованы некорректно, но общий шаблон выглядит как стандартная ярмарка от ~ 15 лет назад. Бросьте его и получите актуальный учебник. (Я нашел учебный сайт - это ужасно). – bbum

ответ

1

ARC включен, поэтому управление памятью автоматическое.

Современное определение этого класса будет объявлена ​​как:

@interface SimpleCar : NSObject 
@property(copy) NSString *make; 
@property(copy) NSString *model; 
@property(copy) NSNumber *vin; 

- initWithMake:(NSString*)make model:(NSString*)model vin:(NSNumber*)vin; 
@end 

И будет реализована как:

@implementation SimpleCar 
- initWithMake:(NSString*)make model:(NSString*)model vin:(NSNumber*)vin 
{ 
    if (self = [super init]) { 
     _make = [make copy]; 
     _model = [model copy]; 
     _vin = [vin copy]; 
    } 
    return self; 
} 
@end 

Вы не обычно реализовать удобный метод как setMake:andModel:. Это просто добавляет следы API, не покупая много на удобном пути. Также возникают вопросы типа «Что происходит, когда я наблюдаю либо make, либо model?».

+0

Зачем ставить свойство NSNumber в копии? спасибо за Ваш ответ; и если я объявляю его сильным, могу инициализировать его следующим образом: _vin = vin; или (self.vin = vin). – samir

+0

Привычка; NSNumber неизменен, поэтому «сильный» будет в порядке. Но для любого класса значений, который отвечает на 'NSCopying', я всегда использую' copy' для безопасности. Таким образом, если какой-либо вызывающий API моего API когда-либо передал изменяемый подкласс «NSNumber», а затем изменит это значение позже, состояние моего объекта останется связным. – bbum

+0

большое спасибо, я сделаю как ты :) – samir