#import "ViewController.h"
@implementation A
- (instancetype)init
{
self = [super init];
if (self)
{
self.databaseQueue = dispatch_queue_create("someQueue", DISPATCH_QUEUE_SERIAL);
}
return self;
}
- (void) privateLogMethod
{
NSLog(@"private log method called");
[NSThread sleepForTimeInterval:1];
}
- (void) performSomeAction
{
for (NSInteger i = 0; i < 10; i++) {
dispatch_async(_databaseQueue, ^{
NSLog(@"inside for loop");
[self privateLogMethod];
});
}
}
- (void) dealloc
{
NSLog(@"removing A from memory");
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.someClassA = [[A alloc] init];
[self.someClassA performSomeAction];
[self performSelector:@selector(removeA) withObject:nil afterDelay:5];
}
- (void) removeA
{
NSLog(@"call to remove A from memory");
self.someClassA = nil;
}
@end
#import <UIKit/UIKit.h>
@interface A: NSObject
- (void) performSomeAction;
@property (nonatomic, strong) dispatch_queue_t databaseQueue;
@end
@interface ViewController : UIViewController
@property (nonatomic, strong) A* someClassA;
@end
如果我們看到上面的代碼中,有因爲class A
一個保留週期保持到databaseQueue
databaseQueue
和持有到self
。因此,當ViewController
在5秒後要求dealloc A
時,class A
持續在deallocating
之前完成循環。以下是輸出。具有保留在循環碼時,其不會引起存儲器泄漏
2017-09-14 14:21:06.774517+0530 testdealloc[72021:1812626] inside for loop
2017-09-14 14:21:06.774768+0530 testdealloc[72021:1812626] private log method called
2017-09-14 14:21:07.775218+0530 testdealloc[72021:1812626] inside for loop
2017-09-14 14:21:07.775480+0530 testdealloc[72021:1812626] private log method called
2017-09-14 14:21:08.778805+0530 testdealloc[72021:1812626] inside for loop
2017-09-14 14:21:08.779251+0530 testdealloc[72021:1812626] private log method called
2017-09-14 14:21:09.784467+0530 testdealloc[72021:1812626] inside for loop
2017-09-14 14:21:09.785089+0530 testdealloc[72021:1812626] private log method called
2017-09-14 14:21:10.790469+0530 testdealloc[72021:1812626] inside for loop
2017-09-14 14:21:10.790929+0530 testdealloc[72021:1812626] private log method called
2017-09-14 14:21:11.775522+0530 testdealloc[72021:1812575] **call to remove A from memory**
2017-09-14 14:21:11.796196+0530 testdealloc[72021:1812626] inside for loop
2017-09-14 14:21:11.796659+0530 testdealloc[72021:1812626] private log method called
2017-09-14 14:21:12.802018+0530 testdealloc[72021:1812626] inside for loop
2017-09-14 14:21:12.802483+0530 testdealloc[72021:1812626] private log method called
2017-09-14 14:21:13.804953+0530 testdealloc[72021:1812626] inside for loop
2017-09-14 14:21:13.805432+0530 testdealloc[72021:1812626] private log method called
2017-09-14 14:21:14.806252+0530 testdealloc[72021:1812626] inside for loop
2017-09-14 14:21:14.806604+0530 testdealloc[72021:1812626] private log method called
2017-09-14 14:21:15.807852+0530 testdealloc[72021:1812626] inside for loop
2017-09-14 14:21:15.808306+0530 testdealloc[72021:1812626] private log method called
2017-09-14 14:21:16.809550+0530 testdealloc[72021:1812626] **removing A from memory**
我的問題是這樣的:我們在代碼中有一個保留循環,但是,這不會導致內存泄漏。在這種情況下,是否可以保留代碼[因爲它肯定不會造成內存泄漏]?或者我應該在塊中使用__weak weakSelf = self
然後使用weakSelf
以確保沒有保留週期?
感謝您的鏈接。這是有見地的。 – prabodhprakash