«self.delegate = self» ARC арқылы iOS жұмыс істемейді

Мен ARC қосылған iOS SDK 4 жобасында жұмыс істеймін.

My class MyTextView (UITextView-тен UITextViewDelegate протоколымен алынған) келесі статикалық әдісті орындайды:

+ (void)showInViewController:(UIViewController*)viewController
{
    MyTextView *textEdit = [[MyTextView alloc] init];
    textEdit.delegate = textEdit;
    [viewController.view addSubview:textEdit];

   //Show the keyboard
    [textEdit becomeFirstResponder];
}

Менің көзқарасым бойынша контроллерлердің бірінде мынаны айтады:

[MyTextView showInViewController:self]

Бұл ескертуімен құлады: becomeFirstResponder ішінде бұрын таңдалған жақтауды қалпына келтіру мүмкін емес. . Кейбір циклдар себебінен кейбір стекке байланысты қателіктерге ұқсайды. Мен ARC-қа өте жаңа. UITextView делегінің сипаты тағайындау деп анықталады (ARC бұл кодты weak деп түсінбеуі керек?). Мен бұл тәсілді өте еске түсіретін білемін. Дегенмен, ARC осындай нәрселерді басқара алатынын білгім келді. Әлбетте, бұл мүмкін емес. Мәселе қандай болуы мүмкін және оны шешу жолдары туралы қандай да бір идея.

2
Caleb-ге рахмет. Мен сәйкес тақырыпты өзгерттім.
қосылды автор Lars Schneider, көзі
Мәселе, делегатор тағайындауы немесе addSubview қоңырауы мәтіндік идентификатор объектісінде «сақтау» орындамайды. Демек, ол әдіс соңында шығарылады.
қосылды автор Lars Schneider, көзі
@chrispix: Сіз дұрыссыз - кем дегенде ARC дана емес. Шындығында бұл менің шешімім. Мен MyTextView нысанын шағымның көрініс реттегішіне қатаң сілтеме беремін. Дегенмен, ARC-тің осы өнімді басқара алатынын білмеймін (бірақ ARC қоқыс жинау емес).
қосылды автор Lars Schneider, көзі
@chrispix: Жоқ, көрсеткішті нақты нысанға қайтару үшін сынып әдісін өзгерттім.
қосылды автор Lars Schneider, көзі
Циклдарды сақтап қалу, әдетте, апаттардың пайда болуына алып келмейді - олар объектілердің бөлінуін болдырмайды.
қосылды автор Caleb, көзі
Мен нақты мәселе қандай екеніне сенімді емеспін, бірақ бұл тәсіл шынымен қиындық тудырады. showInViewController: қолданбасаңыз, MyTextView данасына сілтеме жоқ. Оны сəйкестендіру арқылы сақтау керек, бірақ сіз оған сілтеме жасаудың жақсы əдісі жоқ, сондықтан сіз оны жібере алмайсыз немесе мəтіннің мәнін шығара алмайсыз. Оған қол жеткізудің жалғыз жолы - оның сюжеттің жалған нұсқалары.
қосылды автор Christopher Pickslay, көзі
MyTextView нысанына қалай сілтеме жасайсыз? Сіз оны void қайтаратын сынып әдісін шақыру арқылы жасайсыз.
қосылды автор Christopher Pickslay, көзі
Сонда мәселеде кодты жаңартыңыз.
қосылды автор Christopher Pickslay, көзі
Бұл теңдестірілмеген үлгі болып табылады (өзінің делегаты болуы керек), бірақ бір жағынан бұл делегаттың (яғни, делегат орнатылмаған) сызық параметрін түсіндіріп, апаттың орын алуы туралы біліп, мәселе екенін тексеріңіз.
қосылды автор XJones, көзі
Тағайындалу әлсіздей емес. Әлсіз, тағайындау сияқты көп, бірақ әлсіз айнымалы нилге айналады, сонда оның барлық күшті сілтемелері босатылады.
қосылды автор James, көзі
assign сипаты iOS 4 үшін компиляция кезінде unsafe_unretained сипатына әкеледі.
қосылды автор Alex Nichol, көзі
Бұл жауапты жеткілікті түрде жеткілікті емес, бірақ [super setDelegate: self]; оны шешеді.
қосылды автор Aberrant, көзі

2 жауаптар

Мен ARC және жады басқаруымен ешқандай байланысы жоқ деп ойлаймын, бірақ UITextView өзінен делегат бола алмайтын неғұрлым іргелі мәселе. Ол циклда бекітіледі. Тіркеу хабарламасын textViewDidChangeSelection ішіне қойыңыз және оны қайта-қайта шақырылатындығын көресіз. UITextView делегаттарымен жады мәселесі емес, тек қана логикалық мәселе. showInViewController проблемалы емес, бірақ стандартты UITextView жасаңыз және өз өкілін өзіңізге орнатуға тырыссаңыз да, сол любопытный мінезді көресіз.

1
қосылды
0
қосылды