0

Im пытается отслеживать источник аварии. Я профилировал приложение, чтобы искать зомби, и, похоже, он связан с обновлением текста в одном из моих UILabels. Я не думаю, что устанавливаю значение текста неправильно. Правильно ли это выглядит?Почему мой UILabel получает освобождение?

enter image description here

Здесь я устанавливаю текст UILabels.

- (void) updateTimecodeDisplay 
{ 
    VarController *sharedController = [VarController sharedController]; 

    int time0 = sharedController.timeCode0Property; 
    int time1 = sharedController.timeCode1Property; 
    int time2 = sharedController.timeCode2Property; 
    int time3 = sharedController.timeCode3Property; 
    int time4 = sharedController.timeCode4Property; 
    int time5 = sharedController.timeCode5Property; 
    int time6 = sharedController.timeCode6Property; 
    int time7 = sharedController.timeCode7Property; 
    int time8 = sharedController.timeCode8Property; 
    int time9 = sharedController.timeCode9Property; 


    if (time0 != 16) 
    { 
     [timeCodeLabel0 setText:[NSString stringWithFormat:@"%d", time0]]; 
    } 
    else { 
     [timeCodeLabel0 setText:[NSString stringWithFormat:@""]]; 
    } 
    if (time1 != 16) 
    { 
     [timeCodeLabel1 setText:[NSString stringWithFormat:@"%d", time1]]; 
    } 
    else { 
     [timeCodeLabel1 setText:[NSString stringWithFormat:@""]]; 
    } 
    if (time2 != 16) 
    { 
     [timeCodeLabel2 setText:[NSString stringWithFormat:@"%d", time2]]; 
    } 
    else { 
     [timeCodeLabel2 setText:[NSString stringWithFormat:@""]]; 
    } 
    if (time3 != 16) 
    { 
     [timeCodeLabel3 setText:[NSString stringWithFormat:@"%d", time3]]; 
    } 
    else { 
     [timeCodeLabel3 setText:[NSString stringWithFormat:@""]]; 
    } 
    if (time4 != 16) 
    { 
     [timeCodeLabel4 setText:[NSString stringWithFormat:@"%d", time4]]; 
    } 
    else { 
     [timeCodeLabel4 setText:[NSString stringWithFormat:@""]]; 
    } 
    if (time5 != 16) 
    { 
     [timeCodeLabel5 setText:[NSString stringWithFormat:@"%d", time5]]; 
    } 
    else { 
     [timeCodeLabel5 setText:[NSString stringWithFormat:@""]]; 
    } 
    if (time6 != 16) 
    { 
     [timeCodeLabel6 setText:[NSString stringWithFormat:@"%d", time6]]; 
    } 
    else { 
     [timeCodeLabel6 setText:[NSString stringWithFormat:@""]]; 
    } 
    if (time7 != 16) 
    { 
     [timeCodeLabel7 setText:[NSString stringWithFormat:@"%d", time7]]; 
    } 
    else { 
     [timeCodeLabel7 setText:[NSString stringWithFormat:@""]]; 
    } 
    if (time8 != 16) 
    { 
     [timeCodeLabel8 setText:[NSString stringWithFormat:@"%d", time8]]; 
    } 
    else { 
     [timeCodeLabel8 setText:[NSString stringWithFormat:@""]]; 
    } 
    if (time9 != 16) 
    { 
     [timeCodeLabel9 setText:[NSString stringWithFormat:@"%d", time9]]; 
    } 
    else { 
     [timeCodeLabel9 setText:[NSString stringWithFormat:@""]]; 
    } 
} 

В UILabels объявляются в заголовочном файле, как это:

Я теперь добавил свойства для UILabels, как намекают на ниже, и синтезировал их в файле .m. Тем не менее, проблема с тем же вопросом.

@property (weak) IBOutlet UILabel *timeCodeLabel0; 
@property (weak) IBOutlet UILabel *timeCodeLabel1; 
@property (weak) IBOutlet UILabel *timeCodeLabel2; 
@property (weak) IBOutlet UILabel *timeCodeLabel3; 
@property (weak) IBOutlet UILabel *timeCodeLabel4; 
@property (weak) IBOutlet UILabel *timeCodeLabel5; 
@property (weak) IBOutlet UILabel *timeCodeLabel6; 
@property (weak) IBOutlet UILabel *timeCodeLabel7; 
@property (weak) IBOutlet UILabel *timeCodeLabel8; 
@property (weak) IBOutlet UILabel *timeCodeLabel9; 
+0

В трассировке стека справа, вы можете увидеть, какая линия в updateTimecodeDisplay это время срабатывает на? Вызывается ли updateTimecodeDisplay, когда представление не отображается на экране? – Bek

+0

Вы объявили UILabel глобально, а не как свойства контроллера вида? –

+0

Пожалуйста, прекратите аннулировать свой собственный вопрос, спасибо. – Luke

ответ

1

Я думаю, вы должны проверить это сообщение, чтобы говорить о «->» оператора: Dot (".") operator and arrow ("->") operator use in C vs. Objective-C

Это означает, что вы не должны использовать «->» для доступа к собственности. Потому что есть много базового слоя. Надеюсь это поможет.

IBOutlet следует использовать @weak

+0

Можете ли вы опубликовать, как вы объявляете все свои UILabel? Больше информации может быть полезно. –

+0

Профиль сказал, что это зомби. Это может иметь другие места, которые вызвали эту проблему, и проблема не в том коде, который вы опубликовали. –

+0

IBOutlet следует использовать слабым. В противном случае он будет иметь циклы сохранения. –

Смежные вопросы