1、成员变量和属性区别
1)@interface中大括号里声明的是“成员变量”;
2)@property声明的是“属性”,
@synthesize与@property配对,意义是“合成”。
成员变量与属性的区别主要分为以下两点:
1、在@interface中定义变量的话,为当前类的私有(private),顾名思义,这些变量只能在当前类中被访问;而用@property声明的变量为公有(.h里public .m里private),可以在当前类或者其他类中被访问。
2、使用@interface声明的变量,使用变量名进行访问;@property声明的变量用“_变量名”,或者“self.变量名”的形式进行访问。
2、推荐声明方式
1)在ios第一版中:我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如:注意:(这个是以前的用法)
@interface MyViewController :UIViewController
{
UIButton *myButton;
}
@property (nonatomic, retain) UIButton *myButton;
@end
2)在现在iOS版本中:苹果将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。如果LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。因此,在这个版本中,我们不再为输出口声明实例变量。
ios5更新之后,苹果是建议以以下的方式来使用:
@interface MyViewController :UIViewController
@property (nonatomic, retain) UIButton *myButton;
@end
其实在日常开发过程中能避免使用成员变量与属性的尽量不用,可以用以下方法实现(以UITableView上多个textField为例):
1)创建可变字典,利用UITextFieldDelegate代理存储多个textField.text,要注意的是只有取消textField的第一响应者才执行代理(- (void)textFieldDidEndEditing:(UITextField *)textField{});
2)创建可变数组,存储textField对象,此方法取消所有textField的第一响应者比较实用;
3)为textField设有规律的tag值(比如textField.tag = indexPath.row+100),再利用for循环取消第一响应者。
网友评论