gpt4 book ai didi

ios - 为什么将静态引用传递给类会消耗内存?

转载 作者:行者123 更新时间:2023-12-01 18:57:36 25 4
gpt4 key购买 nike

我很难理解为什么这会消耗内存。

我努力了;

  • 为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上阅读了很多文章,但仍然不了解造成这种内存消耗的原因。

    感谢学生T,我尝试了以下方法。
    - (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)显然是最佳选择,所以我将从这里开始。

    非常感谢您的所有答复!

    最佳答案

    假设您使用ARC进行编译,因为如果不是这样,则整个转换是没有意义的。由于您将代码置于无限循环中,因此实验无法正常进行。您试图使线程休眠,但由于同时停止了正在运行的主线程,因此无法正常工作。您需要使主运行循环有机会在10秒钟的时间内运行。

    关于ios - 为什么将静态引用传递给类会消耗内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25561644/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com