NSString init或alloc错误?

时间:2011-06-02 06:42:07

标签: ios nsstring alloc

我有这个界面:

 #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

现在,如果我制作一个卡片对象,如 卡*卡 然后我像这样运行metod setEffect: [card setEffect:@“”]; 它编译但给我一个运行时错误。谁知道为什么?提前谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你打算[image autorelease][[image retain] autorelease]。否则,您将在每次访问酒店时自动释放它。您也在使用set*方法泄露,因为您在分配新值之前未发布旧值。

答案 1 :(得分:0)

在你的getter方法中,你将返回一个自动释放的对象,该对象可能从未被分配过。换句话说,您只是在setter中分配对象。如果您希望自动释放对象,则必须先分配它们,然后将它们自动释放。

您可能最好为每个ivar创建属性,并让它们保留并由班级发布。如果尚未分配它们,您仍然需要分配它们,您可能希望覆盖要执行的getter。像这样的东西。

-(NSString *)effect {
    if (!effect) {
        effect = [[NSString alloc] init];
    }
return effect;
你的标题中有

NSString *effect;

然后属性

@property(nonatomic, retain) NSString *effect;

然后在实现中你将合成

@synthesize effect;

并在你的 - (void)dealloc

中释放
[effect release];

通过这种方式制作卡片课程后,您可以调用

之类的内容
card.effect = @"Whatever goes in the effect property";

//assuming card is a Card object

希望这有帮助。