在 XPHomePartyViewController、XPNewHomePartyCollectionViewCell 和 XPPartyRoomItemCollectionViewCell 中新增 prepareForReuse 方法以优化内存管理,确保在复用时清理资源。更新 XPRoomViewController 以实现房间UID的CP拉取逻辑,并在 dealloc 方法中添加资源释放保障。优化 MicMidpointRectManager 中的安全级别计算逻辑,确保代码整洁性。

This commit is contained in:
edwinQQQ
2025-09-24 19:40:50 +08:00
parent 6da253b403
commit 12c76609c5
5 changed files with 190 additions and 3 deletions

View File

@@ -190,6 +190,45 @@
make.height.mas_equalTo(kGetScaleWidth(20));
}];
}
- (void)prepareForReuse {
[super prepareForReuse];
//
[self.pkImageView stopAnimation];
self.pkImageView.videoItem = nil;
self.pkImageView.hidden = YES;
//
[self.avatarView cancelLoadImage];
self.avatarView.imageUrl = nil;
self.rankImageView.image = nil;
[self.tagImageView cancelLoadImage];
self.tagImageView.image = nil;
self.tagImageView.hidden = YES;
[self.levelImageView cancelLoadImage];
self.levelImageView.imageUrl = nil;
[self.boomImageView cancelLoadImage];
self.boomImageView.imageUrl = nil;
//
self.nameLabel.attributedText = nil;
self.nameLabel.text = @"";
self.subLabel.text = @"";
self.heatNumLable.text = @"0";
// +
for (NetImageView *iconView in self.iconViews) {
[iconView cancelLoadImage];
iconView.imageUrl = nil;
iconView.hidden = YES;
}
}
- (void)dealloc {
//
[self.pkImageView stopAnimation];
self.pkImageView.videoItem = nil;
}
- (void)setRoomInfo:(HomePlayRoomModel *)roomInfo{
_roomInfo = roomInfo;

View File

@@ -123,6 +123,28 @@
}];
}
- (void)prepareForReuse {
[super prepareForReuse];
//
[self.avatarView cancelLoadImage];
self.avatarView.imageUrl = nil;
self.rankImageView.image = nil;
[self.tagImageView cancelLoadImage];
self.tagImageView.image = nil;
[self.levelImageView cancelLoadImage];
self.levelImageView.imageUrl = nil;
[self.boomImageView cancelLoadImage];
self.boomImageView.imageUrl = nil;
[self.flagImage cancelLoadImage];
self.flagImage.imageUrl = nil;
//
self.nameLabel.attributedText = nil;
self.nameLabel.text = @"";
self.subLabel.text = @"";
self.heatNumLable.text = @"0";
}
- (void)setRoomInfo:(HomePlayRoomModel *)roomInfo {
_roomInfo = roomInfo;
self.avatarView.imageUrl = roomInfo.avatar;

View File

@@ -91,6 +91,25 @@ static NSString * const kHomeLayoutTypeKey = @"kHomeLayoutTypeKey";
return _bannerView;
}
- (void)prepareForReuse {
[super prepareForReuse];
// /CPU
self.bannerView.autoScroll = NO;
self.bannerView.imageURLStringsGroup = nil;
}
- (void)stopAndRelease {
//
self.bannerView.autoScroll = NO;
}
// VC
- (void)resumeIfNeeded {
if (self.bannerView.imageURLStringsGroup.count > 0) {
self.bannerView.autoScroll = YES;
}
}
#pragma mark - SDCycleScrollViewDelegate
- (void)cycleScrollView:(SDCycleScrollView *)cycleScrollView didSelectItemAtIndex:(NSInteger)index {
HomeBannerInfoModel * bannerInfo = [self.bannerInfoList xpSafeObjectAtIndex:index];
@@ -152,8 +171,16 @@ static NSString * const kHomeLayoutTypeKey = @"kHomeLayoutTypeKey";
}
- (void)loadLayoutTypeFromCache {
// UserDefaults NO
self.isTwoColumnLayout = [[NSUserDefaults standardUserDefaults] boolForKey:kHomeLayoutTypeKey];
// UserDefaults
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
id storedValue = [defaults objectForKey:kHomeLayoutTypeKey];
if (storedValue == nil) {
self.isTwoColumnLayout = YES; //
[defaults setBool:YES forKey:kHomeLayoutTypeKey];
[defaults synchronize];
} else {
self.isTwoColumnLayout = [storedValue boolValue];
}
}
- (void)saveLayoutTypeToCache {
@@ -387,6 +414,27 @@ static NSString * const kHomeLayoutTypeKey = @"kHomeLayoutTypeKey";
return CGSizeMake(kGetScaleWidth(345), kGetScaleWidth(92));
}
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
// cell
if ([cell isKindOfClass:[HomePartyBannerCell class]]) {
HomePartyBannerCell *bannerCell = (HomePartyBannerCell *)cell;
[bannerCell stopAndRelease];
} else if ([cell isKindOfClass:[XPNewHomePartyCollectionViewCell class]]) {
// prepareForReuse
[cell prepareForReuse];
} else if ([cell isKindOfClass:[XPPartyRoomItemCollectionViewCell class]]) {
[cell prepareForReuse];
}
}
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
// banner
if ([cell isKindOfClass:[HomePartyBannerCell class]]) {
HomePartyBannerCell *bannerCell = (HomePartyBannerCell *)cell;
[bannerCell resumeIfNeeded];
}
}
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
id item = [self.datasource xpSafeObjectAtIndex:indexPath.row];

View File

@@ -107,7 +107,7 @@
}
BOOL match = (obj.uid == leftUid && obj.loverUid == rightUid) || (obj.uid == rightUid && obj.loverUid == leftUid);
if (match) {
NSInteger safeLevel = MAX(1, MIN(5, obj.cpLevel+1));
NSInteger safeLevel = MAX(1, MIN(5, obj.cpLevel));
NSString *svgaName = [NSString stringWithFormat:@"mic_cp_lv%ld", (long)safeLevel];
[self playSVGAAnimationAtFrame:frame withNamed:svgaName];
break;

View File

@@ -221,6 +221,8 @@ XPCandyTreeInsufficientBalanceViewDelegate>
@property (nonatomic, assign) BOOL currentUserWasOnMic; //
@property (nonatomic, assign) NSInteger currentUserMicPosition; // -1
@property (nonatomic, assign) BOOL hasCompletedRoomInitialization; //
/// UIDCP
@property (nonatomic, assign) BOOL hasRequestedInitialCpByRoomUid;
@end
@@ -363,6 +365,65 @@ XPCandyTreeInsufficientBalanceViewDelegate>
self.upMicAskTimer = nil;
}
// 🔧 /
[TTPopup dismiss];
// 🔧 Turbo Mode Tips
if ([[XPTurboModeTipsManager sharedManager] respondsToSelector:@selector(stopTipsMonitoringInRoom)]) {
[[XPTurboModeTipsManager sharedManager] performSelector:@selector(stopTipsMonitoringInRoom)];
}
// 🔧 GiftComboManager UI VC
if ([GiftComboManager sharedManager]) {
[[GiftComboManager sharedManager] setHandleRoomUIChanged:nil];
}
// 🔧 sideMenu block
if (self.sideMenu) {
if ([self.sideMenu respondsToSelector:@selector(setOpenRedPacketHandle:)]) {
[self.sideMenu performSelector:@selector(setOpenRedPacketHandle:) withObject:nil];
}
if ([self.sideMenu respondsToSelector:@selector(setShowSendGiftView:)]) {
[self.sideMenu performSelector:@selector(setShowSendGiftView:) withObject:nil];
}
}
// 🔧 / delegate
NSArray *possibleDelegates = @[
self.backContainerView,
self.stageView,
self.messageContainerView,
self.quickMessageContainerView,
self.menuContainerView,
self.functionView,
self.littleGameView,
self.anchorScrollView
];
for (id obj in possibleDelegates) {
if (!obj) { continue; }
if ([obj respondsToSelector:@selector(setDelegate:)]) {
[obj performSelector:@selector(setDelegate:) withObject:nil];
}
if ([obj respondsToSelector:@selector(setHostDelegate:)]) {
[obj performSelector:@selector(setHostDelegate:) withObject:nil];
}
if ([obj respondsToSelector:@selector(setAnchorScrollDelegate:)]) {
[obj performSelector:@selector(setAnchorScrollDelegate:) withObject:nil];
}
}
// 🔧 UI
[self __removeAllViews];
self.anchorScrollView = nil;
self.backContainerView = nil;
self.stageView = nil;
self.messageContainerView = nil;
self.quickMessageContainerView = nil;
self.menuContainerView = nil;
self.sideMenu = nil;
self.functionView = nil;
self.littleGameView = nil;
NSLog(@"🔄 XPRoomViewController: 销毁完成");
}
@@ -1875,6 +1936,9 @@ XPCandyTreeInsufficientBalanceViewDelegate>
// 🔧
[self initializeCurrentUserMicStatus];
// 🔧 UIDCP
[self tryRequestInitialCpByRoomUidIfNeeded];
//
if (self.roomInfo != nil) {
[self.presenter reportUserInterRoom:[NSString stringWithFormat:@"%zd", self.roomInfo.uid]];
@@ -1887,6 +1951,18 @@ XPCandyTreeInsufficientBalanceViewDelegate>
}
}
/// UIDCP
- (void)tryRequestInitialCpByRoomUidIfNeeded {
@synchronized (self) {
if (self.hasRequestedInitialCpByRoomUid) { return; }
if (!self.hasCompletedRoomInitialization) { return; }
if (self.isExitingRoom || !self.isViewActive) { return; }
self.hasRequestedInitialCpByRoomUid = YES;
}
NSString *roomUid = [NSString stringWithFormat:@"%ld", (long)self.roomInfo.uid];
[self.presenter micCpListByRoomUid:roomUid];
}
- (void)enterRoomFail:(NSInteger)code {
[XNDJTDDLoadingTool hideHUDInView:self.navigationController.view];
[self hideHUD];
@@ -4221,6 +4297,8 @@ XPCandyTreeInsufficientBalanceViewDelegate>
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.hasCompletedRoomInitialization = YES;
NSLog(@"🔧 进房初始化完成,后续麦位变动将触发 micCpListByUidList 调用");
// UIDCP
[self tryRequestInitialCpByRoomUidIfNeeded];
});
}