2013-08-25 10 views
0

Python에서 몇 년을 보낸 후에 Objective-C로 시작합니다. 몇 가지 개념으로 머리를 감싸기 위해 노력하고 있습니다.이 점을 알 수는 없지만 늘릴 때마다 늘리거나 공제합니다. myCount 메모리에있는 오래된 변수. 나는 ARC를 사용하고있어서 autorelease하지 않아야합니까? 나는 그것이 self.varOfMyCount = [NSString stringWithFormat:@"%d", myCount];Objective-C에서 가능한 메모리 누수가 있습니까?

헤더과 관련이있다 느낌이있다 :

#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 
+0

이러한 인스턴스가 해제되지 않았다고 어떻게 결정 했습니까? – Wain

+0

액티비티 모니터에서 나는 더 많은 메모리를 먹고있었습니다. – Matthew

+0

악기를 사용하여 정확한 할당 (및 누출)을 확인 했습니까? – Wain

답변

2

이미지에서를, 정말 보이지 않는다. 앱을 실행하려면 메모리를 사용해야합니다. 당신이하는 것에 따라 그것은 다른 금액을 사용할 것입니다.

[NSString stringWithFormat:@"%d", myCount];을 사용하면 시스템에 형식 문자열을 구문 분석하고 매개 변수를 입력하도록 요구하기 때문에 생각보다 많은 것을 요구합니다. 문자열을 파싱하고 스캔하는 것은 간단한 작업이 아닙니다.

메모리가 작업에 할당되는 경우가 많지만 릴리스되지 않습니다. 이것은 일반적으로 생성 비용이 비싸거나 (스캔 구조 나 그 일부처럼) 반복적으로 사용되는 경우입니다.

동일한 활동을 수행하고 '일시적'상태로 돌아갈 때마다 메모리가 커지면 걱정해야합니다. 버튼 푸시를 여러 번 반복 실행하고 푸시 할 때마다 힙 샷을 찍습니다. 각각의 힙 샷 (첫 번째와 마지막을 제외하고)이 비어 있다면 (또는 아주 가까운 경우) 모든 것이 좋습니다. 그렇지 않은 경우 정확히 출시되지 않은 내용이 표시됩니다.

+0

아! 그래서 나는 보았습니다. 그래서 저는이 글에서 사용 된 메모리의 큰 덩어리가 글꼴을로드하는 것과 관련되어 있다는 것을 정확하게 보았습니다. http://imgur.com/a/hQIum 상태 표시 줄 레이블을 증가시키고 변경하는 것이 처음이기 때문에 더 구체적으로 말합니까? – Matthew

+0

네, 그게 옳은 것 같아요. – Wain

+0

환상적! 도움을 주셔서 감사합니다. 나는 인스트루먼츠에 대해 더 깊이 알고 싶습니다. Objc로 이동하는 Python에서 오는 누군가에 대한 권장 사항이 있습니까? 나는 스레딩에 대한 좋은 시작을 찾으려고 노력하고있다. 다음은 Python에서 할 수있는 일의 예이지만 메소드에서 Objc로 이월하려고합니다. https://gist.github.com/granda/6335158 – Matthew