我有这个界面:
#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:@“”]; 它编译但给我一个运行时错误。谁知道为什么?提前谢谢!
答案 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
希望这有帮助。