1、成員變量和屬性區(qū)別
1)@interface中大括號(hào)里聲明的是“成員變量”;
2)@property聲明的是“屬性”,
@synthesize與@property配對(duì),意義是“合成”。
成員變量與屬性的區(qū)別主要分為以下兩點(diǎn):
1、在@interface中定義變量的話,為當(dāng)前類的私有(private),顧名思義,這些變量只能在當(dāng)前類中被訪問;而用@property聲明的變量為公有(.h里public .m里private),可以在當(dāng)前類或者其他類中被訪問。
2、使用@interface聲明的變量,使用變量名進(jìn)行訪問;@property聲明的變量用“_變量名”,或者“self.變量名”的形式進(jìn)行訪問。
2、推薦聲明方式
1)在ios第一版中:我們?yōu)檩敵隹谕瑫r(shí)聲明了屬性和底層實(shí)例變量,那時(shí),屬性是oc語言的一個(gè)新的機(jī)制,并且要求你必須聲明與之對(duì)應(yīng)的實(shí)例變量,例如:注意:(這個(gè)是以前的用法)
@interface MyViewController :UIViewController
{
UIButton *myButton;
}
@property (nonatomic, retain) UIButton *myButton;
@end
2)在現(xiàn)在iOS版本中:蘋果將默認(rèn)編譯器從GCC轉(zhuǎn)換為LLVM(low level virtual machine),從此不再需要為屬性聲明實(shí)例變量了。如果LLVM發(fā)現(xiàn)一個(gè)沒有匹配實(shí)例變量的屬性,它將自動(dòng)創(chuàng)建一個(gè)以下劃線開頭的實(shí)例變量。因此,在這個(gè)版本中,我們不再為輸出口聲明實(shí)例變量。
ios5更新之后,蘋果是建議以以下的方式來使用:
@interface MyViewController :UIViewController
@property (nonatomic, retain) UIButton *myButton;
@end
其實(shí)在日常開發(fā)過程中能避免使用成員變量與屬性的盡量不用,可以用以下方法實(shí)現(xiàn)(以UITableView上多個(gè)textField為例):
1)創(chuàng)建可變字典,利用UITextFieldDelegate代理存儲(chǔ)多個(gè)textField.text,要注意的是只有取消textField的第一響應(yīng)者才執(zhí)行代理(- (void)textFieldDidEndEditing:(UITextField *)textField{});
2)創(chuàng)建可變數(shù)組,存儲(chǔ)textField對(duì)象,此方法取消所有textField的第一響應(yīng)者比較實(shí)用;
3)為textField設(shè)有規(guī)律的tag值(比如textField.tag = indexPath.row+100),再利用for循環(huán)取消第一響應(yīng)者。