我想创建2个全局数组,可以在程序运行期间更新。在每次更新中,我将一个元素添加到第零个位置并删除最后一个数字 我创建了数组.... 在.h文件中.......... //////////////
@interface Shared : NSObject{
NSMutableArray *x;
NSMutableArray *y;
}
@property (nonatomic,retain) NSMutableArray *x;
@property (nonatomic,retain) NSMutableArray *y;
+(Shared*)sharedInstance;
@end
在.m文件中
staticShared* sharedInstance;
@implementation Shared
@synthesize x;
@synthesize y;
+(Shared*)sharedInstance
{
if (!sharedInstance) {
sharedInstance=[[Sharedalloc]init];
}
returnsharedInstance;
}
-(Shared*)init
{
self = [superinit];
if(self)
{
x=[[NSMutableArrayalloc] init];
x=[NSMutableArrayarrayWithObjects:@"0",@"0",@"0",@"0",@"0",@"0",@"0",nil];
y=[[NSMutableArrayalloc] init];
y=[NSMutableArrayarrayWithObjects:@"0",@"0",@"0",@"0",@"0",@"0",nil];
}
returnself;
}
@end
然后我习惯使用以下代码调用它们并重新添加ove和添加元素....
[[shared sharedInstance].y removeLastObject];
[[shared sharedInstance].y insertObject:new_element atIndex:0];
[[shared sharedInstance].x removeLastObject];
[[shared sharedInstance].x insertObject:new_element atIndex:0];
同时我调用这些值并使用表达式计算算术值。
这似乎运作良好。但它似乎是一种处理存储在其中的浮点数的低效方法。这些数组创建对象。有没有简单的方法可以创建一个包含指定数量的浮点数的全局数组,并在程序运行期间更新它(数组大小是固定的)删除最后一个对象,并调用它们进行计算?
请帮助我!
编辑1 先生deanWombourne ................................. 我按照你的指示实施!你能不能通过这个来帮助我纠正我得到的2个错误。
在.h文件中
@interface Shared : NSObject{
@private
float input[7];
float output[6];
}
+(Shared*)sharedInstance;
-(void)addNewInput:(float)input1;
-(float *)input;
-(void)addNewOutput:(float)output1;
-(float *)output;
@end
<。>在.m文件中............
@implementation Shared
-(id)init{
if((self =[superinit])){
for(int n=0; n<7 ;++n)
input[n]=0.00f;
for(int n=0; n<6 ;++n)
output[n]=0.00f;
}
returnself;
}
-(void)addNewInput:(float)input1{
input[0]=input[1];
input[1]=input[2];
input[2]=input[3];
input[3]=input[4];
input[4]=input[5];
input[5]=input[6];
input[6]=input1;
}
-(float *)input {
returninput;
}
-(void)addNewOutput:(float)output1{
output[0]=output[1];
output[1]=output[2];
output[2]=output[3];
output[3]=output[4];
output[4]=output[5];
input[5]=output1;
}
-(float *)output {
returnoutput;
}
@end
调用时
float reading= (accel_reading)/(1.165969038*1e5f);
[[SharedsharedInstance] addNewInput:reading];
我得到的问题 1.在实现中,它表示不完整的实现(这是一个警告而不是错误) 2.我如何使用for循环来填充数组值,或者这样可以吗?
我遇到的主要问题, 当我如上所示调用它时,程序停止运行告诉 因未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因'+ [SharedsharedInstance]:无法识别的选择器发送到类0x5780'
请帮助我完成...............
答案 0 :(得分:2)
你的代码Smells(我的意思是以最好的方式!)
使用两个并行数组并保持同步是一种糟糕的设计模式(并且在很多方面都会受到性能影响!)。特别是因为已经存在一个处理同时存储x
和y
的结构 - CGPoint)。
你正在通过转换你的float' primitives to
NSString`对象来解决'只有对象进入数组'的问题,而这种对象非常低效 - 请看一下{{3} } class,它被设计为将原生C基元放入一个对象而无需昂贵的解析操作:)
您可能还想查看NSValue(以及free
等)并在C级处理整个问题 - 这将意味着根本没有任何对象并且会快速地(在代码更复杂的代价)。
希望这有帮助,如果您有任何问题,只需在此答案中添加评论:)
修改
如果您只想存储4 x和y值,那么这可能是最简单的方法:
@interface Shared : NSObject {
@private
CGPoint points[4];
}
+(Shared *)sharedInstance;
- (void)addNewPoint:(CGPoint)point;
- (CGPoint *)points;
@end
@implementation
- (id)init {
if ((self = [super init])) {
// Start with 0,0 for all your points
for (int n = 0; n < 4; ++n)
points[n] = CGPointZero;
}
return self;
}
- (void)addNewPoint:(CGPoint)point {
// Just move all the points along one and add the new one to the end
// (yes, this could be done in a loop but there's not that much point for 4 points!)
points[0] = points[1];
points[1] = points[2];
points[2] = points[3];
points[3] = point;
}
- (CGPoint *)points {
return points;
}
@end
这为您提供了一个方法addNewPoint
,它删除了第一个点,并将新点添加到数组的末尾。
您还可以获得返回4个点的方法points
。使用它像:
// To add a point
CGPoint newPoint = CGPointMake(100, 100);
[[Shared sharedInstance] addNewPoint:newPoint];
// To do something with the points (in this case, NSLog them)
CGPoint *points = [[Shared sharedInstance] points];
for (int n = 0; n < 4; ++n)
NSLog(@" Point %i : %@", n, NSStringFromCGPoint(points[n]));
编辑#2
根据您的评论,您需要两个数组,一个包含输入数据,另一个包含输出数据。尝试这样的事情:
@interface Shared : NSObject {
float inputs[4];
float outputs[5];
}
...
这将为您提供两个读/写数组 - 一个称为输入,另一个称为输出。访问它们的方式与我在第一次编辑中的方式非常相似:
float *inputs = [[Shared sharedInstance] inputs];
for (int n = 0; n < 4; ++n)
NSLog(@" Input %i : %f", n, inputs[n]);
float *outputs = [[Shared sharedInstance] outputs];
for (int n = 0; n < 5; ++n)
NSLog(@" Output %i : %f", n, output[n]);
答案 1 :(得分:0)
链接列表是否会因为您要实现的目标而过度杀伤?它不像浮点数的静态数组那么简单,但是删除最后一个对象并且相当简单快速地插入第0个对象。
答案 2 :(得分:0)
如果你想要一个包含特定数量的对象的数组,你可以使用NSArray,它是静态的,与NSMutableArray相对。
对于数组是Global,只需实现一个包含2个数组的单例类,并提供相关的方法。
在Globals.h中:
@interface Globals : NSObject
+ (Globals *) sharedGlobals;
@end
在Globals.m中:
@implementation Globals
static Globals *sharedGlobals = nil;
+ (Globals *) sharedGlobals{
@synchronized(self){
if (sharedGlobals == nil){
sharedGlobals = [[self alloc] init];
}
}
return sharedGlobals;
}
然后您可以使用以下行访问阵列(在实现它们之后):
[[Globals sharedGlobals] getArrayX];
答案 3 :(得分:0)
这是一个让你前进的草图。
您的数组大小是固定的,只包含浮点数,以C数组开头:
double x[] = {0, 0, 0, 0, 0, 0, 0};
double y[] = {0, 0, 0, 0, 0, 0};
可以计算这些数组中的元素数而不是硬编码:
int xCount = sizeof(x)/sizeof(double);
int yCount = sizeof(y)/sizeof(double);
现在将这些数组用作循环缓冲区,声明游标并初始化:
int xCursor = 0;
队列前面的项目位于光标处:
valueAtFrontOfQueue = x[xCursor]; // get the current front item
要删除前面的值并在后面添加一个值,请用新值替换光标处的值并增加光标:
x[xCursor] = newValueForBackOfQueue; // replace it with new item for back of queue
xCursor = (xCursor + 1) % xCount; // and advance cursor using mod arithmetic to it cycles around
没有包装作为对象加倍,根本没有动态分配。
在你认为合适的情况下将上面的内容包起来,也许作为一个班级,你已经完成了。