0

在 Python 中花费数年之后才开始使用 Objective-C .. 仍然试图围绕一些概念来思考.. 我似乎无法弄清楚这一点,但每次我增加或减少myCount它时都会保留旧变量记忆。我正在使用 ARC,所以它不应该自动释放吗?我有一种感觉,它与self.varOfMyCount = [NSString stringWithFormat:@"%d", myCount];

标题:

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>
{
    IBOutlet NSMenu *statusMenu;
    NSStatusItem *statusItem;
}
- (IBAction)itemOne:(id)sender;
- (IBAction)itemTwo:(id)sender;
- (IBAction)itemThree:(id)sender;



@property (assign) IBOutlet NSWindow *window;
@property (nonatomic, copy) NSString *varOfMyCount;

@end

int myCount = 0;

执行:

#import "AppDelegate.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength ];
    [statusItem setMenu:statusMenu];
    [statusItem setTitle:@"Status"];
    [statusItem setHighlightMode:YES];
}

- (IBAction)itemOne:(id)sender {
    myCount++;
    self.varOfMyCount = [NSString stringWithFormat:@"%d", myCount];
    NSLog(@"%@",self.varOfMyCount);
    [statusItem setTitle:self.varOfMyCount];
}

- (IBAction)itemTwo:(id)sender {
    myCount = myCount-1;
    self.varOfMyCount = [NSString stringWithFormat:@"%d", myCount];
    NSLog(@"%@",self.varOfMyCount);
    [statusItem setTitle:self.varOfMyCount];

}

- (IBAction)itemThree:(id)sender {
    NSLog(@"Quit.");
    [[NSApplication sharedApplication] terminate:nil];
}
@end
4

1 回答 1

2

从您的图像来看,看起来确实没有问题。为了让您的应用程序运行,它确实需要使用内存。根据您的操作,它将使用不同的数量。

使用[NSString stringWithFormat:@"%d", myCount];要求比您想象的要多,因为您要求系统解析格式字符串并将参数注入其中。解析和扫描字符串并不是一项简单的操作。

在许多情况下,当为任务分配内存时,它不会被释放。当创建成本高(如扫描结构或其部分)或可能重复使用时,通常会出现这种情况。

如果每次您执行相同的活动并返回“瞬态”状态时内存会变大,您应该担心。考虑运行按钮按下的多次迭代,并在每次按下之间进行一次堆拍摄。如果每个堆射击(除了第一个和最后一个)都是空的(或非常接近它),那么一切都很好。如果没有,它将准确显示未发布的内容。

于 2013-08-25T16:57:24.080 回答