我遇到了一个似乎对我没有任何意义的Objective-C问题.我是一个相对精通的ObjC程序员,理解整个"前瞻性宣言"的概念,但这个让我摸不着头脑.所以这是交易:
ClassA是我的Xcode项目中的一个类,它只是项目.ClassB是ClassA的子类,它是公共的,并导入到我的框架的头文件中.
我正在建立一个"无法找到'ClassA'的接口声明,'ClassB'的超类......"错误.我已经@class ClassA;在ClassB.h中提出了前向声明,但这似乎并没有解决问题.当我更改@class ClassA;为#import ClassA.h,它工作正常.但是,由于ClassA只是项目,因此依赖项目无法构建ClassB,因为它无法访问ClassA的源代码.
任何帮助将不胜感激,我希望这是有道理的.谢谢!
我将一些旧代码移植到Objective-C ARC(自动引用计数),它看起来效果很好.当一个相当大的高级对象从我的导航堆栈弹出时没有被释放,让我相信我有一个ARC隐藏在我身边的某个保留周期(或者至少很难跟踪).清除这个潜在保留周期的最佳方法是什么和/或什么是确定ARC下内存泄漏原因的好方法?谢谢!
您可能还记得,我正在尝试使用GCD来加速我的一些代码,即碰撞检测和分辨率引擎.但是,我显然做错了,因为我的所有GCD代码都比我的串行代码慢得多且不那么一致(慢了1.4倍到10倍之间).请允许我举个例子:我以冒泡排序方式迭代数组,以确定该数组中对象之间可能发生的所有冲突:
- (double) detectCollisionsInArray:(NSArray*)objects
{
int count = [objects count];
if (count > 0)
{
double time = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < count; i++)
{
for (int j = i + 1; j < count; j++)
{
/** LOTS AND LOTS OF WORK FOR EACH OBJECT **/
}
}
return CFAbsoluteTimeGetCurrent() - time;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
非常简单,考虑到问题的限制,它似乎表现良好.但是,我想利用以下事实:在代码部分中不修改每个对象的状态,并使用GCD来并行化这项工作.要做到这一点,我尝试这样的事情:
- (double) detectCollisionsInArray:(NSArray*)objects
{
int count = [objects count];
if (count > 0)
{
NSOperationQueue* opQueue = [[NSOperationQueue …Run Code Online (Sandbox Code Playgroud) 对.我目前正在上一个正在探索许多不同编程语言的课程.其中包括COBOL和Ada,我似乎无法找到免费的编译器.有没有人有更好的运气,如果有的话,我会在哪里找到它们?谢谢!
我正在尝试将一些GCD集成到我的代码中,并且发现严重的瓶颈是我在大型数组中的对象之间执行的泡泡比较.这是原始代码:
NSUInteger count = [arrayToDoWorkOn count];
for (int i = 0; i < count; i++)
{
for (int j = i + 1; j < count; j++)
{
[[arrayToDoWorkOn objectAtIndex:i] compare:[arrayToDoWorkOn objectAtIndex:j]];
}
}
Run Code Online (Sandbox Code Playgroud)
让我的漂移?因此,许多其他快速枚举任务可以通过转换轻松进行GCD
for (id obj in array)
{
[obj aMessage:stuff];
}
Run Code Online (Sandbox Code Playgroud)
至:
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
[obj aMessage:stuff];
}];
Run Code Online (Sandbox Code Playgroud)
有没有办法将我的前瞻 - sorta-bubble-sorta-algorithm-thing转换为可以提供给GCD块实现的东西?
我正在构建一个简单的粒子系统,并希望使用结构的单个数组缓冲区来管理我的粒子.也就是说,我找不到允许我从任意缓冲区中取出malloc()和free()的C函数.这是一些伪代码来表明我的意图:
Particle* particles = (Particle*) malloc( sizeof(Particle) * numParticles );
Particle* firstParticle = <buffer_alloc>( particles );
initialize_particle( firstParticle );
// ... Some more stuff
if (firstParticle->life < 0)
<buffer_free>( firstParticle );
// @ program's end
free(particles);
Run Code Online (Sandbox Code Playgroud)
其中<buffer_alloc>和<buffer_free>是从任意指针分配和释放内存块的函数(可能具有诸如缓冲区长度等的附加元数据).这些功能是否存在和/或有更好的方法吗?谢谢!
我有一个应用程序,每一步迭代一个数组,当数组为空时,我似乎得到惊人的缓慢结果.所以,我调查了一些类似的后续测试:
NSMutableArray* ar = [NSMutableArray array];
double time = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < 10000; i++)
{
for (NSObject* obj in ar)
{
[obj retain];
[obj release];
}
}
time = CFAbsoluteTimeGetCurrent() - time;
printf("Empty Time: %1.12f", time / 10000.0f);
time = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < 10000; i++)
{
if ([ar count] > 0)
{
for (NSObject* obj in ar)
{
[obj retain];
[obj release];
}
}
}
time = CFAbsoluteTimeGetCurrent() - time; …Run Code Online (Sandbox Code Playgroud) 嘿互联网.我在C中有一个非常奇怪的问题.我导出一个浮点值,然后检查它是否大于0.但是,即使该值小于零,比较总是评估为true.这是代码:
if (sVel > 0.0f)
{
sVel += 1.0f;
sVel -= 1.0f;
NSLog(@"SEP VEL: %1.6f", sVel);
return;
}
Run Code Online (Sandbox Code Playgroud)
因此,将sVel设置为100会按预期打印日志并点击return语句; 凉.然而,sVel设置为-100并不能打印日志仍然碰到return语句.我完全糊涂了,我不知道从哪里开始跟踪这个......
objective-c ×6
c ×2
xcode ×2
ada ×1
cobol ×1
cocoa ×1
collections ×1
concurrency ×1
ios ×1
iphone ×1
logic ×1
macos ×1
particles ×1