mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-18 03:20:09 +00:00
ASDisplayNode and several subclasses had previously cleared memory-heavy objects like the backing store and text layout manager when the node's view or layer is removed from a visible heirarchy. This works great in any system that uses a "working range", where exiting the range removes the node from the hierarchy and reclaiming memory at that time is important. However, for standard UIViewController patterns (unused in Paper), this behavior causes highly undesirable thrashing (leading to visible flashes & wasteful re-rendering of content). After this change, node subclasses should implement -reclaimMemory if they need to perform any other cleanup besides backing store destruction when they leave a working range or other scenario where memory reduction is valuable. To trigger this behavior, calling code should use -recursivelyReclaimMemory. r=nadi
109 lines
2.8 KiB
Objective-C
109 lines
2.8 KiB
Objective-C
/* This file provided by Facebook is for non-commercial testing and evaluation
|
|
* purposes only. Facebook reserves all rights not expressly granted.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
#import "ViewController.h"
|
|
|
|
#import <AsyncDisplayKit/AsyncDisplayKit.h>
|
|
|
|
#import "BlurbNode.h"
|
|
#import "KittenNode.h"
|
|
|
|
static const NSInteger kLitterSize = 20;
|
|
|
|
|
|
@interface ViewController () <ASTableViewDataSource, ASTableViewDelegate>
|
|
{
|
|
ASTableView *_tableView;
|
|
|
|
// array of boxed CGSizes corresponding to placekitten kittens
|
|
NSArray *_kittenDataSource;
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
@implementation ViewController
|
|
|
|
#pragma mark -
|
|
#pragma mark UIViewController.
|
|
|
|
- (instancetype)init
|
|
{
|
|
if (!(self = [super init]))
|
|
return nil;
|
|
|
|
_tableView = [[ASTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
|
|
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // KittenNode has its own separator
|
|
_tableView.asyncDataSource = self;
|
|
_tableView.asyncDelegate = self;
|
|
|
|
// populate our "data source" with some random kittens
|
|
NSMutableArray *kittenDataSource = [NSMutableArray arrayWithCapacity:kLitterSize];
|
|
for (NSInteger i = 0; i < kLitterSize; i++) {
|
|
u_int32_t deltaX = arc4random_uniform(10) - 5;
|
|
u_int32_t deltaY = arc4random_uniform(10) - 5;
|
|
CGSize size = CGSizeMake(350 + 2 * deltaX, 350 + 4 * deltaY);
|
|
|
|
[kittenDataSource addObject:[NSValue valueWithCGSize:size]];
|
|
}
|
|
_kittenDataSource = kittenDataSource;
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)viewDidLoad
|
|
{
|
|
[super viewDidLoad];
|
|
|
|
[self.view addSubview:_tableView];
|
|
}
|
|
|
|
- (void)viewWillLayoutSubviews
|
|
{
|
|
_tableView.frame = self.view.bounds;
|
|
}
|
|
|
|
- (BOOL)prefersStatusBarHidden
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
|
|
#pragma mark -
|
|
#pragma mark Kittens.
|
|
|
|
- (ASCellNode *)tableView:(ASTableView *)tableView nodeForRowAtIndexPath:(NSIndexPath *)indexPath
|
|
{
|
|
// special-case the first row
|
|
if (indexPath.section == 0 && indexPath.row == 0) {
|
|
BlurbNode *node = [[BlurbNode alloc] init];
|
|
return node;
|
|
}
|
|
|
|
NSValue *size = _kittenDataSource[indexPath.row - 1];
|
|
KittenNode *node = [[KittenNode alloc] initWithKittenOfSize:size.CGSizeValue];
|
|
return node;
|
|
}
|
|
|
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
|
{
|
|
// blurb node + kLitterSize kitties
|
|
return 1 + _kittenDataSource.count;
|
|
}
|
|
|
|
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
|
|
{
|
|
// disable row selection
|
|
return NO;
|
|
}
|
|
|
|
@end
|