【问题标题】:Cocos2d MenuItem Selector and Accessing Instance VariableCocos2d MenuItem 选择器和访问实例变量
【发布时间】:2011-04-22 08:58:15
【问题描述】:

我在实现文件中声明了一个实例变量,可以使用 synthesize 定义的属性访问它

@synthesize myProperty

现在,我想在 cocos2d 库的 MenuItem 的 Selector 事件中为这个属性分配一些东西。您可以将其视为在回调函数中访问 myProperty。出于某种原因,每当我访问该属性时,它都会显示“属性超出范围”。因此,我尝试将访问权限分配给 self.myProperty !

但现在我在 self.myProperty 中有内存泄漏。如果我在 dealloc 中释放 self.myProperty,那么它会抛出一个异常,说我也有 myProperty 释放。

更新 1:(代码)

NSString *voice;

@property (nonatomic,retain) NSString *voice; @合成声音;

-(void)repeatAlphabet:(id)sender 

{
 *// I cannot access the voice variable in this function.* 

[[SimpleAudioEngine sharedEngine] playEffect:[[voice lowercaseString] stringByAppendingString:@".caf"]]; 
}

-(void) addRepeatButtonOnScreen 

{

CCMenuItemImage * menuItem1 =[CCMenuItemImage itemFromNormalImage:@"image1.png"

selectedImage: @"image2.png"

  target:self

selector:@selector(repeatAlphabet:)];

CCMenu *menu = [CCMenu menuWithItems:menuItem1,nil]; 

menu.position = ccp(30, 450); 

[self addChild:menu]; 


}

【问题讨论】:

    标签: iphone objective-c cocos2d-iphone


    【解决方案1】:

    假设您定义了一个与您的属性相对应的 ivar,也称为 myProperty,并且您的属性是 retaincopy:在您的 dealloc 中,您应该使用 [myProperty release]; 而不是 [self.myProperty release]

    更新:经过讨论并显示更多代码......“超出范围”可能是没有保留应该保留的值的症状。例如对于字符串value = @"Value" 不保留(并将超出范围),使用self.value = @"Value"value = [@"Value" retain] 修复。

    【讨论】:

    • 感谢您的回复!是的,我这样做了 [myProperty release],但由于我在 MenuItem 选择器的回调函数中使用 self.myProperty,因此 self.myProperty 永远不会被释放,并且它显示仪器应用程序中的内存泄漏。
    • 您需要更具体地说明“使用”的含义(显示代码会有很大帮助)。如果你的property是合成retain的,self.myProperty = value会在retain之前自动释放之前的值,所以不会泄露。
    • 请检查上面更新的代码!感谢您的帮助!
    • 好的,当出现问题时,语音的价值是什么?它是如何设置的?
    • voice 的值在不同的函数中赋值。该值通常只是一个字符串,如“voice1”、“voice2”等。但是当触发了 repeatAlphabet 时,变量 voice 将无法访问,并且被认为超出了范围!
    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2023-03-15
    相关资源
    最近更新 更多