OC 메모리 관리 사용

1998 단어
클래스 방법으로 만든 대상을 어떻게 release해?!클래스 방법에 추가autoRelease 방법으로main 함수에서 이 클래스 방법을 사용할 때 하나의 스레드 탱크를 만들면 시스템은 자동으로 이 클래스 방법이 만든 대상을 가장 가까운 스레드 탱크에 넣는다(OC .스레드 탱크의 drain( ) 방법을 호출하면 클래스 방법으로 만든 대상을 방출할 수 있습니다!왜 이런 방법Test *a = [Test getInstance] 아래에서 [a release] 방법을 사용하지 않습니까?!첫째, 여기 호출 가능!그런데 다른 예는 안 돼요. 왜 당신은 클래스 밖에 있어서 제 클래스 안에 도대체 alloc init가 몇 개의 대상을 만들었는지 몰라요. 당신은 당신이 release에도...그러니까 저희가 여기서 autoRelease자동방출을 해야 돼요. 지연방출이라고도 해요.
main.m 파일
#import 
#import "Test.h"

//void foo(int i) {
//    Test *a = [[Test alloc] init] ;
//    Test *b = nil ;
//    if (i > 10) {
//        b = a ;
//        [b retain] ;
//    }
//    [a release] ;
//    [b release] ;
//}

int main(int argc, const char * argv[]) {
//    foo(1) ;
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init] ;
    Test *a = [Test getInstance] ;
    NSLog(@"main before drain") ;
    [pool drain] ;
    NSLog(@"main after drain") ;
    return 0;
}


Test.h 파일
#import 

@interface Test : NSObject
+ (Test *)getInstance ;
@end


Test.m 파일

#import "Test.h"

@implementation Test

// :  ;
- (instancetype)retain {
    NSLog(@"Test:before Retain: %@" , @(self.retainCount)) ;
    id result = [super retain] ;
    NSLog(@"Test after Retain %@" , @(self.retainCount)) ;
    return result ;
}


- (oneway void)release {
    NSLog(@"Test:before Release: %@" , @(self.retainCount)) ;
    [super release] ;
    NSLog(@"Test:before Release: %@" , @(self.retainCount)) ;
    
    
}


- (void)dealloc {
    [super dealloc] ;
    NSLog(@"Test:dealloc") ;
}


+ (Test *)getInstance {
    Test *result = [[[Test alloc] init] autorelease] ;
    return result ;
}

@end


프로그래밍이 이 세상을 더욱 아름답게 하기를 바란다

좋은 웹페이지 즐겨찾기