0

我有这个界面:

 #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

现在,如果我制作一个 Cards 对象,例如 Cards* card 然后我像这样运行方法 setEffect: [card setEffect:@""]; 它编译但给了我一个运行时错误。有谁知道为什么?提前致谢!

4

2 回答 2

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 类后,您可以调用类似

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

//assuming card is a Card object

希望这可以帮助。

于 2011-06-02T07:02:17.253 回答
0

我想你打算[image autorelease]成为[[image retain] autorelease]。否则,您将在每次访问该属性时自动释放它。您还泄漏了您的set*方法,因为您没有在分配新值之前释放旧值。

于 2011-06-02T06:53:16.303 回答