1伏社、如果最近你很不幸將XCode升級(jí)至8.0之后浪感,你會(huì)發(fā)現(xiàn)你以前運(yùn)行好好的項(xiàng)目程序,突然就crash了伊群。你感覺(jué)莫名其妙,如果你的項(xiàng)目中剛好使用了第三方布局庫(kù)Masonry策精,打斷點(diǎn)你會(huì)發(fā)現(xiàn)錯(cuò)誤既然你是設(shè)置的一些約束出現(xiàn)了問(wèn)題舰始。因?yàn)榧s束出現(xiàn)crash的原因大致有兩個(gè):
(1).XCode8中程序內(nèi)原來(lái)2個(gè)字的寬度是24,現(xiàn)在2個(gè)字需要27的寬度來(lái)顯示了咽袜。與字體有關(guān)的控件因?yàn)檫@個(gè)原因可能就會(huì)出現(xiàn)問(wèn)題丸卷,導(dǎo)致crash。
(2).XCode8之后询刹,由Masonry布局引起crash的原因還有可能是你之前使用Masonry布局的時(shí)候不夠嚴(yán)謹(jǐn)谜嫉,導(dǎo)致在iOS10上面出現(xiàn)crash,因?yàn)榭赡茉趇OS9之前你布局不嚴(yán)謹(jǐn)還不會(huì)crash凹联,到iOS10上面可就不行沐兰,
對(duì)于想適配iOS10以及Xcode8的,大家可以上網(wǎng)去查閱相關(guān)資料蔽挠。
2住闯、使用Masonry時(shí)出現(xiàn)couldn't find a common superview,根據(jù)錯(cuò)誤提示我們大概知道了錯(cuò)在哪里澳淑,你所設(shè)置約束的這個(gè)控件和所依賴(lài)的控件沒(méi)有共同的父視圖比原。因?yàn)闆](méi)有共同的視圖作為參照,frame 就不能轉(zhuǎn)換到一個(gè)相同的坐標(biāo)系杠巡。這個(gè)問(wèn)題經(jīng)常會(huì)出現(xiàn)在量窘,我們創(chuàng)建了要設(shè)置約束的視圖,而沒(méi)有將它添加到父控件中氢拥,又或者蚌铜,要設(shè)置約束的這個(gè)視圖和所依賴(lài)的視圖沒(méi)有共同的父視圖锨侯,也就是你遇到的這種情況。
(1).解決方案:在masonry控制對(duì)象約束前把對(duì)象增加進(jìn)入某控件
[self.view addSubview:label];
(2).添加完之后厘线,你發(fā)現(xiàn)還是有問(wèn)題识腿,這個(gè)時(shí)候你就要看下你設(shè)置約束的視圖和它所參照的視圖,找來(lái)找去你還是沒(méi)有找到原因造壮,還有個(gè)原因可能是渡讼,
[self.view addSubview:self.InsertView];
[self.InsertView addSubview:_cashLabel];
[self.cashLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.InsertView.mas_left).equalTo(@10);
make.top.equalTo(self.InsertView.mas_top).equalTo(@14);
}];
你會(huì)發(fā)你使用了_下劃線語(yǔ)法,剛好你有對(duì)label進(jìn)行了懶加載耳璧,重載了其get方法成箫。self.cashLabel會(huì)調(diào)用屬性的getter方法,觸發(fā)懶加載旨枯,但是_cashLabel只是訪問(wèn)一個(gè)局部變量蹬昌。所以這樣添加的控件總是出錯(cuò)的原因也就在這里了。
由于本人水平有限攀隔,如有寫(xiě)錯(cuò)的地方還望指出皂贩,本人也會(huì)第一時(shí)間修改錯(cuò)誤,避免誤導(dǎo)大家昆汹。