__NSAutoreleaseNoPool(): ... utoreleased with no pool in place - just leaking

本文针对Mac OS 10.6下使用Xcode 3.2.6开发过程中遇到的__NSAutoreleaseNoPool()内存泄漏问题,通过创建NSAutoreleasePool来解决。详细介绍了在多线程环境下如何正确管理内存,避免因 autorelease 导致的内存泄漏。

__NSAutoreleaseNoPool(): ... utoreleased with no pool in place - just leaking

我的平台

mac os 10.6
Xcode 3.2.6

编译时出的问题

  1. 2013-12-02 21:52:33.177 UniworkC[1662:4307] *** __NSAutoreleaseNoPool(): Object 0x134830 of class __NSCFDate autoreleased with no pool in place - just leaking
  2. 2013-12-02 21:52:33.178 UniworkC[1662:4307] *** __NSAutoreleaseNoPool(): Object 0x113900 of class NSCFNumber autoreleased with no pool in place - just leaking
  3. 2013-12-02 21:52:33.179 UniworkC[1662:4307] *** __NSAutoreleaseNoPool(): Object 0x10f590 of class NSCFLocale autoreleased with no pool in place - just leaking
  4. 2013-12-02 21:52:33.180 UniworkC[1662:4307] *** __NSAutoreleaseNoPool(): Object 0x30a4 of class NSCFString autoreleased


原来的代码

  1. void savePNGImage(CGImageRef imageRef, NSString *path)
  2. {
  3.     
  4.     NSURL *fileURL = [NSURL fileURLWithPath:path];
  5.     CGImageDestinationRef dr = CGImageDestinationCreateWithURL(( CFURLRef)fileURL, kUTTypePNG , 1, NULL);

  6.     CGImageDestinationAddImage(dr, imageRef, NULL);
  7.     CGImageDestinationFinalize(dr);
  8.     
  9.     CFRelease(dr);
  10. }

  11. void save()
  12. {
  13.     CGDirectDisplayID displayID = CGMainDisplayID();
  14.     CGImageRef imageRef = CGDisplayCreateImage(displayID);
  15.     
  16.     NSDate* now = [NSDate date];
  17.     NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
  18.     fmt.dateFormat = @"yyMMddHHmmss";
  19.     //fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
  20.     NSString* dateString = [fmt stringFromDate:now];
  21.     
  22.     NSString *path = [[NSString stringWithFormat:@"~/Desktop/tmp/%@.png", dateString ] stringByExpandingTildeInPath];
  23.     NSLog(@"save file: %@", path);
  24.     savePNGImage(imageRef, path);
  25.     
  26.     CFRelease(imageRef);    
  27. }


  28. void *screenCaputureFunc( void *para)
  29. {
  30.     for(int i=0; i< 10; i++){
  31.         sleep(10);
  32.         save();
  33.     }
  34.     
  35.     printf("end of capture\n");
  36.     return (void *)0;
  37. }



更改为

  1. void savePNGImage(CGImageRef imageRef, NSString *path)
  2. {
  3.     
  4.     // references: http://stackoverflow.com/questions/8225838/save-cgimageref-to-png-file-errors-arc-caused
  5.     NSURL *fileURL = [NSURL fileURLWithPath:path];
  6.     CGImageDestinationRef dr = CGImageDestinationCreateWithURL(( CFURLRef)fileURL, kUTTypePNG , 1, NULL);

  7.     CGImageDestinationAddImage(dr, imageRef, NULL);
  8.     CGImageDestinationFinalize(dr);
  9.     
  10.     //CFRelease(dr);
  11. }

  12. void save()
  13. {
  14.     // references: http://stackoverflow.com/questions/8225838/save-cgimageref-to-png-file-errors-arc-caused
  15.     
  16.     CGDirectDisplayID displayID = CGMainDisplayID();
  17.     CGImageRef imageRef = CGDisplayCreateImage(displayID);
  18.     
  19.     NSDate* now = [NSDate date];
  20.     NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
  21.     fmt.dateFormat = @"yyMMddHHmmss";
  22.     //fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
  23.     NSString* dateString = [fmt stringFromDate:now];
  24.     
  25.     NSString *path = [[NSString stringWithFormat:@"~/Desktop/tmp/%@.png", dateString ] stringByExpandingTildeInPath];
  26.     NSLog(@"save file: %@", path);
  27.     savePNGImage(imageRef, path);
  28.     
  29.     //CFRelease(imageRef);    
  30. }


  31. void *screenCaputureFunc( void *para)
  32. {
  33.     for(int i=0; i< 10; i++){
  34.         sleep(10);
  35.         
  36.         NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  37.         save();
  38.         [pool release];
  39.     }
  40.     
  41.     printf("end of capture\n");
  42.     return (void *)0;
  43. }


增加的自动释放的内存池。
参考

  1. The error you get is caused by something somewhere creating an Objective-C class (NSURL) using the convenience static method [NSURL urlWithString:]. Methods that return objects that aren't "alloc" or "copy" should put the object inside an autorelease pool before returning the object. And since you haven't setup one up it'll just crash or leak memory.
  2. I'm not sure exactly how to fix this but you need to put something like:

  3. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  4. doStuff();
  5. [pool release];
  6. somewhere in your code.

刚刚做MAC的开发,不能给出什么更深层次的解释,只是得到这么个心得:
有不能控制内存的代码,放在自动释放的内存池中。
以后再做解释吧

参考
http://stackoverflow.com/questions/2557562/using-apple-autorelease-pools-without-objective-c

==================================== 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D HEAP ANALYSIS RESULT 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D ==================================== 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D 2 APPLICATION LEAKS 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D References underlined with "~~~" are likely causes. 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D Learn more at https://squ.re/leaks. 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D 2647654 bytes retained by leaking objects 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D Displaying only 1 leak trace out of 4 with the same signature 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D Signature: fdec896f9915b97d8eb71b3c37007a9eeb7b6c35 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D ┬─── 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ GC Root: Thread object 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D ├─ com.ahjswy.cn.utils.PDH$3 instance 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: UNKNOWN 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Retaining 675.5 kB in 7599 objects 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Anonymous subclass of java.lang.Thread 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Thread name: 'Thread-46' 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ PDH$3.val$paCallBack 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ ~~~~~~~~~~~~~~ 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D ├─ com.ahjswy.cn.ui.outgoods.OutDocAddMoreGoodsActByNew$1 instance 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: UNKNOWN 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Retaining 670.2 kB in 7577 objects 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Anonymous class implementing com.ahjswy.cn.utils.PDH$ProgressCallBack 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ this$0 instance of com.ahjswy.cn.ui.outgoods.OutDocAddMoreGoodsActByNew with mDestroyed = true 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ OutDocAddMoreGoodsActByNew$1.this$0 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ~~~~~~ 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ╰→ com.ahjswy.cn.ui.outgoods.OutDocAddMoreGoodsActByNew instance 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ Leaking: YES (ObjectWatcher was watching this because com.ahjswy.cn.ui.outgoods.OutDocAddMoreGoodsActByNew 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ received Activity#onDestroy() callback and Activity#mDestroyed is true) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ Retaining 670.2 kB in 7576 objects 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ key = fa9ac7f9-f278-4e6e-a567-cd47c2673793 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ watchDurationMillis = 58731 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ retainedDurationMillis = 53730 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ mApplication instance of com.ahjswy.cn.app.MyApplication 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ mEmbeddedApplication instance of com.ahjswy.cn.app.MyApplication 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ mBase instance of android.app.ContextImpl 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 6565 bytes retained by leaking objects 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D Signature: 9c5b257e00a0fb79337a2dea58c80c8eaad7bf09 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ┬─── 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ GC Root: Thread object 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ├─ WV.md instance 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: NO (PathClassLoader↓ is not leaking) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Thread name: 'CleanupReference' 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ Thread.contextClassLoader 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ├─ dalvik.system.PathClassLoader instance 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: NO (PDH↓ is not leaking and A ClassLoader is never leaking) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ ClassLoader.runtimeInternalObjects 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ├─ java.lang.Object[] array 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: NO (PDH↓ is not leaking) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ Object[1079] 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ├─ com.ahjswy.cn.utils.PDH class 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: NO (a class is never leaking) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ static PDH.toastImage 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ~~~~~~~~~~ 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ├─ android.widget.ImageView instance 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: UNKNOWN 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Retaining 7.4 kB in 47 objects 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ View not part of a window view hierarchy 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ View.mAttachInfo is null (view detached) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ View.mID = R.id.iv_toast 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ View.mWindowAttachCount = 2 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ mContext instance of com.ahjswy.cn.app.MyApplication 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ View.mParent 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ~~~~~~~ 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ╰→ android.widget.LinearLayout instance 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ Leaking: YES (ObjectWatcher was watching this because android.widget.LinearLayout received 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ View#onDetachedFromWindow() callback) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ Retaining 6.6 kB in 64 objects 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ key = 8b7a1cc5-96cd-4467-acd3-16fc8e25c74b 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ watchDurationMillis = 5615 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ retainedDurationMillis = 549 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ key = 0ce6e4a7-146d-4735-ac6f-42c56ddd8ac4 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ key = 9da710dc-d301-46c1-9bc8-7985fff8c621 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ watchDurationMillis = 21453 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ retainedDurationMillis = 16452 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ View not part of a window view hierarchy 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ View.mAttachInfo is null (view detached) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ View.mWindowAttachCount = 2 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ mContext instance of com.ahjswy.cn.app.MyApplication 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ==================================== 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 0 LIBRARY LEAKS 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D A Library Leak is a leak caused by a known bug in 3rd party code that you do not have control over. 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D See https://square.github.io/leakcanary/fundamentals-how-leakcanary-works/#4-categorizing-leaks 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ==================================== 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 0 UNREACHABLE OBJECTS 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D An unreachable object is still in memory but LeakCanary could not find a strong reference path 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D from GC roots. 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ==================================== 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D METADATA 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D Please include this in bug reports and Stack Overflow questions. 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Build.VERSION.SDK_INT: 34 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Build.MANUFACTURER: Xiaomi 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D LeakCanary version: 2.12 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D App process name: com.ahjswy.cn 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Class count: 29261 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Instance count: 302994 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Primitive array count: 190945 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Object array count: 35651 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Thread count: 67 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Heap total bytes: 41270991 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Bitmap count: 338 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Bitmap total bytes: 24534146 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Large bitmap count: 0 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Large bitmap total bytes: 0 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 1: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 2: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 3: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 4: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 5: open /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 6: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 7: open /data/user/0/com.ahjswy.cn/databases/bugly_db_ 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 8: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 9: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 10: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 11: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 12: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 13: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 14: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Stats: LruCache[maxSize=3000,hits=145979,misses=256357,hitRate=36%] 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D RandomAccess[bytes=14567145,reads=256357,travel=114319837516,range=40190063,size=58168636] 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Heap dump reason: 5 retained objects, app is visible 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Analysis duration: 44549 ms 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Heap dump file path: /storage/emulated/0/Download/leakcanary-com.ahjswy.cn/2025-09-08_15-36-17_238.hprof 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Heap dump timestamp: 1757317030950 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Heap dump duration: 3674 ms 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D ====================================
09-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值