/ / Цел-С - Работа с подсекции - цел-c, uiview, uitableview

Цел-С - Работа с подсещания - цел-c, uiview, uitableview

Аз съм малко объркан. Аз подкласирам UITableViewCell да създам собствен дизайн на клетка. В -initWithStyle: метод I "m настройка някои UILabelТова е така:

self.careerTitleLabel = [[UILabel alloc] init];
[self.contentView addSubview:careerTitleLabel];
[self.careerTitleLabel release];

След това, за да поставите етикета, направя това -layoutSubviews така:

CGRect careerTitleLabelFrame = CGRectMake(10, 10, 280, 20);

self.careerTitleLabel.frame = careerTitleLabelFrame;

Този код действително работи. Поставя моя етикет там, където искам да бъде позициониран. Но това, което не разбирам, е КАК това работи. Тъй като аз просто модифицирам рамката на careerTitleLabel ivar, а не кариернатаTitleLabel, която е добавена като subView към contentView.

Моето предположение би било, че да модифицирам рамката на етикета, която бях добавил към contentView, че ще трябва да го извадя, като използвам -viewWithTag: и след това да промените тази рамка. В момента просто модифицирам ivar от класа?

P.S Друг cliffhanger, несвързан с този въпрос, е защо self.careerTitleLabel има retainCount на 2 след като бъде освободен? D.S

Отговори:

3 за отговор № 1

addSubview: не копира изгледа, който го предавате, той го запазва, така че, когато го освободите, той всъщност не е делокализиран. Той е жив, защото self.contentView все още го използва. Това означава, че вашето позоваване на self.careerTitleLabel по-нататък все още работи, въпреки че мисля, че повечето ще го смятат за лош стил на основание, че трябва да държите собствените си препратки към предметите, които възнамерявате да съобщавате по-късно, отколкото да импортирате знания от модели на собственост, използвани другаде.

retainCount никога не трябва да се разчита напълно. То също е непрозрачно колко addSubview: ще увеличи броя на задържанията, освен че ще бъде най-малко 1. Така се казва, най-вероятната причина, ако сте заявили careerTitleLabel като имот и има линия като:

NSLog(@"%d", [self.careerTitleLabel retainCount]);

Това ли е стандартното поглъщане:

return [[careerTitleLabel retain] autorelease];

Така броят на задържанията временно се увеличава споглъщателя, като се има предвид, че резултатите от получателите трябва да живеят най-малко толкова дълго, колкото авторелизния басейн - дори ако обектът, от който сте ги получили, е делокализиран преди това.


1 за отговор № 2

careerTitleLabel е показалец към обект. Така че, когато го направите addSubview: careerTitleLabel, кодът, който наричате, се отнася за careerTitleLabel.

По-късно, когато включите рамката careerTitleLabel в layoutSubviews, актуализирате същия обект.

layoutSubviews е абсолютно точното място за това. Той се извиква автоматично в началото и отново, ако се променят границите на изгледа. Например ако ориентацията на устройството се промени.

viewWithTag е друг начин за достъп до подсектор. Лично аз смятам, че е по-чист, за да поддържате ivar. Не забравяйте, че можете да използвате IBOutlets, за да свържете тези неща с помощта на Interface Builder.

И накрая, имате проблем с паметта и товаобяснява броя на задържанията. Добре е да тичате Анализирайте често, за да вземете тези проблеми, а също така и профилите с инструменти, използващи течове. Можете дори да зададете флаг в настройките си за създаване, за да стартирате винаги Анализирайте всеки път, когато създавате.

Във всеки случай тук е въпросът:

self.careerTitleLabel = [[UILabel alloc] init];

Ако собствеността ви в .h файла е настроена като:

@property (nonatomic, retain)

тогава ще се задържите тук. Ще запазите два пъти и това ще доведе до проблеми с паметта.

Насоките на Apple препоръчват никога да не се обаждате на тезинастройтели в един метод на начало. На този етап поведението може да бъде непредсказуемо, тъй като бихте могли да преминете през персонализиран наборКакво и да е метод, докато вашият обект все още не е завършил това.

Много по-безопасно е да имате:

    careerTitleLabel = [[UILabel alloc] init];

Дори по-добре, във вашия .h файла префиксирайте това с "m" за членната променлива. Тогава ще го имаш

    mCareerTitleLabel = [[UILabel alloc] init];

Във вашия синтез, използвайте:

    synthesize careerTitleLabel = mCareerTitleLabel;

Това ще означава, че отвън - или вътре - вашият код, можете да получите достъп до него като:

    self.careerTitleLabel

или

    myObjectName.careerTitleLabel

Надявам се това да помогне! Това е много за покриване!