2016-06-07 1 views
0

앱 사용 중에 끊임없이 메모리 사용량이 증가한다는 것을 제외하고는 잘 실행되는 largish objective-c iPhone 프로젝트가 있습니다. 앱이 활발하게 사용되지 않는 동안 증가하지 않습니다.Objective-C 인스턴스 변수 메모리 문제 (ARC 사용시)

Java에서이 문제가없는 거의 동일한 Android 앱이 있습니다. 인터넷 검색 및 실험을 많이 한 후에는 모든 클래스 변수가 인스턴스 변수라고 생각합니다. 즉, 아래의 .m 파일에서 선언되고 getters 및 setter를 사용하여 액세스됩니다.

@implementation SomeClass{ 
    NSString *someVariable; 
    AnotherClass *anotherVariable; 
} 

두 개의 개체가 인스턴스 변수를 통해 서로 참조되는 경우가 많습니다. 나는 이것이 메모리 문제가 어디서 왔는가라고 생각한다. ARC가 나머지 객체에 대한 나머지 포인터를 1 개 갖고있어 메모리에서 어느 것도 해제하지 않는다는 것을 알았다.

이상적으로 모든 변수를 .h 파일로 이동하지 않아도되는 솔루션을 원합니다. 변수 당 정의를 변경하지 않아도됩니다. 즉, 모든 변수에 적용 할 수있는 솔루션을 원합니다. 이것이 가능한지 안다면. 인스턴스 변수가 '강'하다고 말하는 것이 옳다고 생각합니다. 객체의 ARC 참조 횟수를 늘리면 모든 인스턴스 변수를 '약하게'만들 수 있습니까? 그렇다면이 것이 좋거나 나쁘다는 생각입니까?

+0

FYI를 .h 또는 .m으로 옮기는 것은 중요하지 않습니다. .h로 이동하면 공개하게됩니다. –

+0

좋아, 나는 그들에게 사적인 것을 원한다. 그래서 그들도 '약하게'할 수 있을까? – AndyW

+0

서로 참조하는 개체로 인해 문제가 발생할 수 있습니다. 부모와 자식 객체가 있다고 생각하십니까? 필요한 속성을 자식에게 전달할 수 있지만 자식은 약한 속성을 통해 부모 만 참조합니다. – Dominic

답변

0

부모에게 자식에 대한 참조가있는 부모 클래스를 참조하는 인스턴스 변수 앞에 __weak 또는 __unsafe_unretained를 넣음으로써 해결했습니다. 이 중 하나를 사용하면 상위 개체에 대한 참조 횟수가 증가하지 않습니다.

변수에 액세스했지만 객체가 릴리스되었을 때 예외가 발생하도록하려면 __unsafe_unretained를 사용하십시오. 예외를 원하지 않으면 __weak을 사용하십시오. 변수가 해제 될 때 변수는 0이됩니다.

@implementation SomeClass{ 
    NSString *someVariable; 
    ChildClass *childVariable; 
    __unsafe_unretained ParentClass *parentVar; 
    __weak AnotherParentClass *AnotherParentVar; 
}