2013-04-11 72 views
3

使用「自我」我試圖通過使TriggerIO本地插件播放語音音頻上的iPodMusicPlayer頂部,但我無法訪問self對象。在@implementation

#import "alert_API.h" 

@implementation alert_API 

+ (void)play:(ForgeTask*)task text:(NSString *)filename { 
    NSURL* url = [[NSBundle mainBundle] URLForResource:@"Rondo_Alla_Turka_Short" withExtension:@"aiff"]; 
    NSAssert(url, @"URL is valid."); 
    NSError* error = nil; 


    /* ERROR: /Users/gsquare567/forge-workspace/plugins/audio/inspector/ios-inspector/ForgeModule/alert/alert_API.m:45:13: Member reference type 'struct objc_class *' is a pointer; maybe you meant to use '->'? */ 
    self->player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 

    /* ERROR: /Users/gsquare567/forge-workspace/plugins/audio/inspector/ios-inspector/ForgeModule/alert/alert_API.m:45:13: Incomplete definition of type 'struct objc_class' */ 
    if(!self.player) 
    { 
     NSLog(@"Error creating player: %@", error); 
    } 


    [task success:nil]; 
} 

@end 

,該場所被alert_API.h定義:

#import <Foundation/Foundation.h> 
#import <AVFoundation/AVFoundation.h> 

@interface alert_API : NSObject 

@property (nonatomic, strong) AVAudioPlayer* player; 
+ (void)play:(ForgeTask*)task text:(NSString *)filename; 

@end 

什麼我需要在這裏做的是能夠在我的API訪問player財產?

謝謝!

+3

這是一個類方法,而不是一個實例方法。在類方法中,'self'指的是'class',而不是任何實例。您不能從類方法訪問ivars。在類方法中,'self'可以用來調用其他類方法,但基本上就是這樣。 – rmaddy 2013-04-11 14:32:53

回答

6

您的play:text:方法是靜態的,這意味着self不引用具有該屬性的實例,而是引用alert_API的類對象。你可以改變你的方法是一個實例方法(的- (void)代替+ (void)):

- (void)play:(ForgeTask*)task text:(NSString *)filename; 

或者,如果你想保留的方法靜態的,你就必須實現它返回一個球員單一個靜態方法:

+ (AVAudioPlayer *)playerInstance; 

然後使用[alert_API playerInstance]從您的方法訪問播放器。

+5

「+」表示類方法,而不是靜態方法。 – rmaddy 2013-04-11 14:34:14

+4

@rmaddy +1也'自我在這方面是無效的.'它是有效的。它是對類對象的引用,而不是類的實例。 – 2013-04-11 14:37:09

+0

非常感謝! '-'實例方法編譯,但作爲插件方法工作,我需要保持它作爲一個類方法。我剛剛學到了很多:) – Garrett 2013-04-11 14:44:21