これがメモリを消費している理由を理解するのに苦労しています。
私が試してみました;
- ARC がクリーンアップするための時間を増やす
- 渡すグローバルの __weak コピーの作成
- __bridge または __bridge_transfer の使用を検討しましたが、これは適切ではないと思います。
- グローバルを公開して直接参照する (機能しますが、実用的ではありません)
この iOS Objective c スレッドは、Java アプリから j2objc 0.9.3 を介して変換されます。
@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 についてかなりの量を読みましたが、このメモリ消費の原因をまだ理解していません。
Student 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 を使用) が明らかに最良の選択肢であるため、そこから始めます。
ご回答ありがとうございます。