• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - Objective-C - 因保留周期而丢失

[复制链接]
菜鸟教程小白 发表于 2022-12-13 05:07:56 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

在解雇我的 VC 时,我注意到我没有从内存中释放所有内容。我对如何找到我的保留周期感到非常迷茫。我正在使用 NSTimer 和 NSNotificationCenter,但我确保在退出之前使和 removeObservers 无效,并且我确保使用弱委托(delegate)。

我的保留周期还会发生在哪里?在动画 block 中?像这样?

 [UIView animateWithDuration:.1 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
                self.setListTableViewVertConst.constant = 0;
                self.setListTableViewHeightConst.constant = 264;
            } completion:^(BOOL finished) {

            }];

在使用 GCD 时,我确保使用 weakSelf。

__weak typeof(self) weakSelf = self;
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf.remotePasswordTextField resignFirstResponder];
            });

感谢您的帮助。

编辑:

-(void)prepareForSegueUIStoryboardSegue *)segue senderid)sender
{
    //Send the room code to be displayed on the respective view controllers. 
    if ([segue.identifier isEqualToString"toSetListRoomVC"]) {
        SetListRoomViewController *setListVC = segue.destinationViewController;
        setListVC.roomCode = self.roomCodeTextField.text;
    }

}

viewWIllApear

[super viewWillAppear:YES];


    self.socket = [[SocketKeeperSingleton sharedInstance]socket];
    self.socketID = [[SocketKeeperSingleton sharedInstance]socketID];

    NSString *roomCodeAsHost = [[SocketKeeperSingleton sharedInstance]hostRoomCode];
    /////////HOST/////////
    if ([[SocketKeeperSingleton sharedInstance]isHost]) {

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selectorselector(receiveHostSongAddedNotification
                                                     name:kQueueAdd
                                                   object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selectorselector(receiveUserJoinedNotification
                                                     name:kUserJoined
                                                   object:nil];

        NSLog(@"User is the host of this room");
        self.isHost = YES;
        [self viewForNoCurrentArtistAsHost];
        self.roomCodeLabel.text = roomCodeAsHost;

        if (!self.hostQueue) {
            self.hostQueue = [[NSMutableArray alloc]init];
        }
        if (!self.hostCurrentArtist) {
            self.hostCurrentArtist = [[NSMutableDictionary alloc]init];
        }

        if (!self.player) {
            self.player = [[AVPlayer alloc]init];
        }
        if (!self.timer) {
            self.timer = [[NSTimer alloc]init];
        }
    }

    ///////NOT HOST///////
    else {
        // Add a notifcation observer and postNotification name for updating the tracks.
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selectorselector(receiveQueueUpdatedNotification
                                                     name:kQueueUpdated
                                                   object:nil];

        //Add a notifcation observer and postNotification name for updating current artist.
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selectorselector(receiveCurrentArtistUpdateNotification
                                                     name:kCurrentArtistUpdate
                                                   object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selectorselector(receiveOnDisconnectNotification
                                                     name:kOnDisconnect
                                                   object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selectorselector(receiveHostDisconnectNotification
                                                     name:kHostDisconnect
                                                   object:nil];


        //Add some animations upon load up. Purple glow and tableview animation.
        double delay = .4;
        [self purpleGlowAnimationFromBottomWithDelay:&delay];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationBottom];

        //Set Current artist, if there is one.
        NSDictionary *currentArtist = [[SocketKeeperSingleton sharedInstance]currentArtist];
        [self setCurrentArtistFromCurrentArtist:currentArtist];


        //Set the current tracks, if there is one.
        NSArray *setListTracks = [[SocketKeeperSingleton sharedInstance]setListTracks];
        if (setListTracks) {
            self.tracks = setListTracks;
        }
    }
}

tableVIEWs

-(NSInteger)tableViewUITableView *)tableView numberOfRowsInSectionNSInteger)section
{
    if (tableView.tag == 1) {
        if (self.isHost) {
            return [self.hostQueue count];
        }
        else return [self.tracks count];
    }
    else return [self.searchTracks count];
}

-(NSInteger)numberOfSectionsInTableViewUITableView *)tableView
{
    return 1;
}



Best Answer-推荐答案


我注意到您在某些评论中使用了“popOut”一词,因此我假设您使用的是导航 Controller 。

如果是这种情况,您的 View Controller 将被嵌入它的导航 Controller 保留,并且不会被释放。导航 Controller 需要保存对您的 VC 的引用(请参阅 UINavigationController.viewControllers),以便在您弹出层次结构中的顶部/下一个 VC 时它可以返回到它。

这是预期的行为。

关于ios - Objective-C - 因保留周期而丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28270768/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap