【发布时间】:2012-01-30 14:37:11
【问题描述】:
我有一个 xcode 项目,它有 2 个类 - Stem 和 Player,我试图确保我的代码从面向对象的角度来看是可靠的,我相信我的 Player 类访问我的 Stem 中的信息是可以接受的编程实践类。
我想从 stem 中的数组中访问索引 - 我可以在视图控制器中使用
stem.index[i]
当我尝试从玩家那里执行此操作时,我不允许这样做,因为没有声明词干。我尝试将 Stem.h 导入到我的 Player.m 文件中并在播放器中声明词干(类似于在视图控制器中执行此操作的方式),但结果却出现错误(在“词干”之前的预期说明符-限定符列表)。
这样做的正确方法是什么?请原谅任何松散的术语使用,因为我对此比较陌生。在此先感谢:)
编辑
这里有一些代码可以说明一些事情,在 viewController 我声明了 stem & player
#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>
#import "Stem.h"
#import "Player.h"
@interface TestApp_v1ViewController : UIViewController {
Stem *stem;
Player *player;
我在 viewController.m 中分配和初始化我的两个对象 stem & player
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"Init Successful");
[self loadMOV];
[self setupInterface];
stem = [[Stem alloc] init];
player = [[Player alloc] init];
}
然后我移到 Stem.h 并再次声明 stem(这样当 stem.h 被导入 player.h 时,玩家可以访问这个词干 - 根据 glogic 的评论)
#import <Foundation/Foundation.h>
@interface Stem : NSObject {
int *index;
int numberOfStems;
Stem *stem;
}
@property(nonatomic,readwrite) int *index;
@property(nonatomic, retain) Stem *stem;
Player.h 看起来像这样:
// Player.h
#import <Foundation/Foundation.h>
#import "Stem.h"
@interface Player : NSObject {
NSMutableArray *player1;
}
@property(nonatomic,retain) NSMutableArray *player1;
-(void) playAudio;
@end
最后在 Player.m 中我尝试访问索引数组
#import "Player.h"
@implementation Player
@synthesize player1;
-(void)playAudio {
NSLog(@"play audio called");
NSLog(@"index[0] is: %i", stem.index[0]);
}
@end
我仍然被告知 stem 是未声明的,有什么想法吗?
编辑 #2 - 添加基本程序
我希望这被认为没问题,但我决定发布我的程序(精简到最基本的内容)。我认为这可能是解决问题的唯一方法——因为跨班级发生了很多事情。我一直在努力让它工作好几个小时啊……
我在 viewController 中分配并初始化了我的 stem 和 player 对象 - 我认为这是解决此问题的最佳方法,但也许有更好的方法。
//Part (i)
// TestApp_v1ViewController.h
#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>
#import "Stem.h"
#import "Player.h"
@interface TestApp_v1ViewController : UIViewController {
Stem *stem;
Player *player;
}
@property(nonatomic, retain) Stem *stem;
@property(nonatomic, retain) Player *player;
@end
//Part (ii)
// TestApp_v1ViewController.m
#import "TestApp_v1ViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@implementation TestApp_v1ViewController
@synthesize stem;
@synthesize player;
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"Init Successful");
stem = [[Stem alloc] init];
[stem loadURLs];
player = [[Player alloc] init];
[player playAudio];
int index = stem.value;
NSLog(@"r is: %i", index); //checking to see if I can get a value from the index array - this works fine, so 'value' can be accessed from the viewController
}
在这里我声明了一个 int 数组和我想稍后从我的播放器访问的 int“值”(这就是问题所在)
//Part (iii)
// Stem.h
#import <Foundation/Foundation.h>
@interface Stem : NSObject {
NSMutableArray *urlArray;
int *index;
int value;
int numberOfStems;
Stem *stem;
}
- (void)loadURLs;
- (void)randomiseAudioForInitialPlay;
@property(nonatomic,retain) NSMutableArray *urlArray;
@property(nonatomic,readwrite) int *index;
@property(nonatomic,readwrite) int numberOfStems;
@property(nonatomic,readwrite) int value;
@property(nonatomic, retain) Stem *stem;
@end
//Part (iv)
// Stem.m
#include <stdio.h>
#import "Stem.h"
@implementation Stem
@synthesize numberOfStems;
@synthesize urlArray;
@synthesize index;
@synthesize stem;
@synthesize value;
- (void)loadURLs
{
NSLog(@"Loading URLs");
numberOfStems = 20;
urlArray = [[NSMutableArray alloc] init];
for ( int i = 1; i <= numberOfStems; i++ ) {
NSString *soundName = [NSString stringWithFormat:@"stem-%i", i];
NSString *soundPath = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
NSURL *soundFile = [[NSURL alloc] initFileURLWithPath:soundPath];
[urlArray addObject:soundFile];
[soundFile release];
}
[self randomiseAudioForInitialPlay];
}
- (void)randomiseAudioForInitialPlay
{
index = malloc(numberOfStems*sizeof(int));
for (int i = 0; i < numberOfStems; i++)
{
index[i] = i;
}
for (int i = (numberOfStems - 1); i > 0; i--)
{
int randomIndex = arc4random() % i;
int tmp = index[i];
index[i] = index[randomIndex];
index[randomIndex] = tmp;
}
value = self.index[10]; //this is what needs to be accessed later, from player
NSLog(@"value at index 10 is:%i", value);
}
@end
这里我包含了“Stem.h”,因为玩家需要 stem 才能返回 stem.value
//Part (v)
// Player.h
#import <Foundation/Foundation.h>
#import "Stem.h"
@interface Player : NSObject {
Player *player;
}
@property(nonatomic, retain) Stem *stem;
@property(nonatomic, retain) Player *player;
-(void) playAudio;
@end
这是出错的地方,我的 NSLog 语句告诉我值是 0,即使我可以看到它(例如)在词干中是 14。编译器也没有报错。
//Part (vi)
// Player.m
#import "Player.h"
@implementation Player
@synthesize player;
@synthesize stem;
-(void)playAudio {
int value = stem.value;
NSLog(@"value is:%i", value );
}
@end
这是我在面向对象项目中的第一次正确尝试,所以我在工作中学习,关于为什么我不能在我的 Player 类中访问 stem.value 的任何建议?
我对这样一个程序中的各种对象如何相互交互(以及正确的语法)的想法仍然很模糊,所以请原谅我在我的代码中出现疯狂的 n00b 错误:)
【问题讨论】:
-
请发布更多代码,以便我们更好地理解您的问题
-
我用一些相关代码编辑了我的帖子
标签: objective-c xcode