我很难理解为什么这会消耗内存。
我试过了;
- 让 ARC 有更多时间进行清理
- 创建要传递的全局变量的 __weak 副本
- 看着使用 __bridge 或 __bridge_transfer 但我不认为这是合适的。
- 公开全局变量并直接引用它(有效,但不切实际)
这个 iOS 目标 c 线程是通过 j2objc 0.9.3 从 Java 应用程序翻译的。
@implementation Comms_StatusThread
- (void)run {
while (true) {
// Consumes memeory at aproximately 100k per 5 min
[S globals];
@try {
[JavaLangThread sleepWithLong:10];
}
@catch (JavaLangInterruptedException *e) {
}
}
这个翻译后的静态单例存储“全局”,可以从应用程序的任何地方访问(真实代码存储更多的类和回调)。
@implementation S
Globals * S_globals__ = nil;
+ (Globals *)globals {
{
if (S_globals__ == nil) S_globals__ = [[Globals alloc] init];
return S_globals__;
}
}
@end
任何帮助表示赞赏。我是objective-c和ARC的新手。我已经阅读了大量关于 ARC 的内容,但仍然不明白这种内存消耗的原因。
感谢学生 TI 尝试了以下方法。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(test:) userInfo:nil repeats:YES];
return YES;
}
-(void) test: (NSObject*) o {
[S comms];
[S globals];
}
这不会消耗内存,我打算这样做,但是tball 的新答案(使用 j2objc @AutoreleasePool)显然是最好的选择,所以我将从那里开始。
非常感谢您的所有回答!