有关于OC内存管理的使用

2017-04-19  本文已影响18人  小苗晓雪

用类方法创建的对象你怎么release掉?!
用在类方法里追加autoRelease方法 , 在main函数里使用该类方法的时候创建一个线程池, 系统会自动把这个类方法创建的对象放入离它最近的线程池里(OC的约定) ;调用线程池的drain(干涸)方法即可释放类方法创建的对象!
为什么不在该类方法 Test *a = [Test getInstance] 下面调用 [a release]方法呢?!第一这里调用可以!但是其他例子就不行了为什么因为你在类外面你不知道我类里边到底alloc init创建了多少个对象 , 你要知道你尽管release...... 所以说我们在这里要进行autoRelease自动释放也被称为延后释放

main.m文件

#import <Foundation/Foundation.h>
#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 <Foundation/Foundation.h>

@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

愿编程让这个世界更美好

上一篇下一篇

猜你喜欢

热点阅读