NSString ошибка инициализации или выделения? - PullRequest
0 голосов
/ 02 июня 2011

У меня есть этот интерфейс:

 #import <Foundation/Foundation.h>
 @interface Cards : NSObject {  NSString* effect;   NSString* image;   }
-(NSString*) effect;
-(NSString*) image;
-(void) setEffect: (NSString*) effect2;
-(void) setImage: (NSString*) image2;

@end

И эта реализация:

#import "Cards.h"
@implementation Cards
-(NSString*) effect
{
    return [effect autorelease];
}
-(NSString*) image
{
    return [image autorelease];
}
-(void) setEffect: (NSString*) effect2
{
  effect = [[NSString alloc]initWithString:effect2];
}
-(void) setImage: (NSString*) image2
{
  image = [[NSString alloc]initWithString:@""];
}
-(void) dealloc
{
    [effect release];
    [image release];
    [super dealloc];
}
@end

Теперь, если я сделаю объект Карты, например Карты * карта и затем я запускаю метод setEffect следующим образом: [card setEffect: @ ""]; Компилируется, но выдает ошибку времени выполнения. Кто-нибудь знает почему? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 июня 2011

В ваших методах получения вы возвращаете автоматически освобожденный объект, который, возможно, никогда не был выделен для начала. Другими словами, вы только распределяете объекты в своем установщике. Если вы хотите, чтобы ваши объекты возвращались автоматически, вы должны сначала выделить их, а затем вернуть их автоматически.

Возможно, вам лучше создать свойства для каждого ивара, а классы сохранят и выпустят их. Вам по-прежнему нужно распределять их, если они не были распределены, что вы можете переопределить для метода получения. Что-то вроде этого.

-(NSString *)effect {
    if (!effect) {
        effect = [[NSString alloc] init];
    }
return effect;

в заголовке у вас будет

NSString *effect;

и затем свойство

@property(nonatomic, retain) NSString *effect;

тогда в реализации вы бы синтезировали

@synthesize effect;

и отпустите в своем - (void) dealloc

[effect release];

Таким образом, после того, как вы создадите класс Card, вы можете назвать такие вещи, как

card.effect = @"Whatever goes in the effect property";

//assuming card is a Card object

Надеюсь, это поможет.

0 голосов
/ 02 июня 2011

Я думаю, вы намеревались [image autorelease] быть [[image retain] autorelease].В противном случае вы будете автоматически освобождать его при каждом доступе к собственности.Вы также используете методы set*, поскольку вы не освобождаете старые значения до назначения новых.

...