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 オブジェクトを作成し、次のようにメソッド setEffect を実行すると: [card setEffect:@""]; コンパイルはできますが、実行時エラーが発生します。理由を知っている人はいますか?前もって感謝します!

4

2 に答える 2

0

するつもりだったと思い[image autorelease]ます[[image retain] autorelease]。そうしないと、プロパティにアクセスするたびに自動解放されます。set*新しい値を割り当てる前に古い値を解放していないため、メソッドもリークしています。

于 2011-06-02T06:53:16.303 に答える
0

getter メソッドでは、最初から割り当てられていない可能性のある自動解放されたオブジェクトを返しています。つまり、セッターでオブジェクトを割り当てるだけです。オブジェクトを自動解放して返す場合は、最初にオブジェクトを割り当ててから、自動解放して返す必要があります。

各 ivar のプロパティを作成し、それらをクラスによって保持および解放する方がよい場合があります。それらが割り当てられていない場合は、まだそれらを割り当てる必要があります。これは、ゲッターをオーバーライドして行うことができます。このようなもの。

-(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 に答える