nth otto 语句 auto 说明 方法 不可见 ide
在 ios 第一版中:
我们为输出口同时声明了属性和底层实例变量,那时,属性是 oc 语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如:
注意:(这个是以前的用法)
- @interface MyViewController :UIViewController
- {
- UIButton *myButton;
- }
- @property (nonatomic, retain) UIButton *myButton;
- @end
在现在 iOS 版本中:
苹果将默认编译器从 GCC 转换为 LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。如果 LLVM 发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。因此,在这个版本中,我们不再为输出口声明实例变量。
ios5 更新之后,苹果是建议以以下的方式来使用:
- @interface MyViewController :UIViewController
- @property (nonatomic, retain) UIButton *myButton;
- @end
因为编译器会自动为你生成以下划线开头的实例变量_myButton,不需要自己手动再去写实例变量。而且也不需要在.[email protected] myButton,也会自动为你生成 setter,getter 方法。
[email protected]:(1)让编译器为你自动生成 setter 与 getter 方法。(2)可以指定与属性对应的实例变量,[email protected] myButton = xxx;那么 self.myButton 其实是操作的实例变量 xxx,而不是_myButton 了。
现在:[email protected] myButton,那么生成的实例变量就是 myButton;[email protected] myButton,那么生成的实例变量就是_myButton。所以跟以前的用法还是有点细微的区别。
二、实例变量与属性变量使用方法
在 MyViewController.m 文件中,编译器也会自动的生成一个实例变量_myButton。那么在. m 文件中可以直接的使用_myButton 实例变量,也可以通过属性 self.myButton. 都是一样的。用 self.yourButton 来访问 yourButton 变量是不对的,Xcode 会提示你使用->, 改成 self->yourButton 就可以了。因为 OC 中点的表达式是表示调用 yourButton 方法,而上面代码没有 yourButton 方法,也可以直接使用 yourButton。
三、类别中的属性 property
类与类别中添加的属性要区分开来,因为类别中只能添加方法,不能添加实例变量。经常会在 ios 的代码中看到在类别中添加属性,这种情况下,是不会自动生成实例变量的。比如在:UINavigationController.h 文件中会对 UIViewController 类进行扩展
- @interface UIViewController (UINavigationControllerItem)
- @property(nonatomic,readonly,retain) UINavigationItem *navigationItem;
- @property(nonatomic) BOOL hidesBottomBarWhenPushed;
- @property(nonatomic,readonly,retain) UINavigationController *navigationController;
- @end
这里添加的属性,不会自动生成实例变量,这里添加的属性其实是添加的 getter 与 setter 方法。
注意一点,匿名类别 (匿名扩展) 是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。
四、成员变量、实例变量、属性变量的联系
@interface MyViewController :UIViewControlle
{
UIButton *yourButton;
int count;
id data;
}
@property (nonatomic, strong) UIButton *myButton;
@end
在 { } 中所声明的变量都为成员变量。 所以 yourButton、count、data 都是成员变量。既然如此,实例变量又是什么意思呢?
实例变量本质上就是成员变量,只是实例是针对类而言,实例是指类的声明。{ } 中的 yourButton 就是实例变量。id 是 OC 特有的类,本质上讲 id 等同于(void *)。所以 id data 属于实例变量。
成员变量用于类内部,无需与外界接触的变量。因为成员变量不会生成 set、get 方法,所以外界无法与成员变量接触。根据成员变量的私有性,为了方便访问,所以就有了属性变量。属性变量的好处就是允许让其他对象访问到该变量(因为属性创建过程中自动产生了 set 和 get 方法)。当然,你可以设置只读或者可写等,设置方法也可自定义。所以,属性变量是用于与其他对象交互的变量。
综上所述可知:成员变量是定义在{}号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量。因为实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。而属性变量是用于与其他对象交互的变量。
但是,现在大家似乎都不怎么喜欢用成员变量来定义类的变量,都喜欢用属性变量来定义类的变量。把需要与外部接触的变量定义在. h 文件中,只在本类中使用的变量定义在. m 文件中。
[email protected] abc;的情况下,系统不会自动生成实例变量 "_abc", 直接通过变量名 abc , 也就是直接使用变量名在赋值运算的时候(= 号左边), 只是将内存区域的指针赋值给变量,相当于 assgin. 如果是通过 "点语句"self.abc= 来赋值,[email protected]��了,如果没有加上上述描述词,就默认为 assign。
[email protected] abc; 系统会默认自动在. h 文件 {} 中添加一个 不可见的 加"_"的成员变量(即使是变量名中本身就带有"_")
// 括号里面定义的都是成员变量(基本数据类型 + 类生成变量),里面的变量可以在. m 文件中通过 "变量名称"、self->"变量名称" 直接访问到括号里面的变量,但是,这样的赋值访问只能是 assign,原对象的引用计数器不会发生变化。
//1.@sythesize 变量名;2.@sythesize 变量名 =_变量名;[email protected] ([email protected] 中定义的变量)
1. 成员变量,实例变量通过 "变量名" 或者 self->"变量名" 直接访问到,赋值(assign)。self. 变量名 实现 setter,getter 方法。
2. 成员变量,实例变量通过 "_变量名" 或者 self->"_变量名" 直接访问到,赋值(assign)。self. 变量名 实现 setter,getter 方法。
3. 成员变量。实例变量(系统自动在原来变量名前加上 "_" 来生成的实例,成员变量),直接通过 self->_变量名,或者变量名直接访问到(assign)。self. 变量名 实现 setter,getter 方法。
[email protected],但是在 {} 中有定义成员变量,[email protected] ,那么可以直接通过 self->"{}中的变量名",或者直接使用 "{}中的变量名" 来访问赋值,这样的变量没有定义 setter,getter 函数,只能是 assign 的方式赋值。
[email protected],@sythesize abc 直接在. m 文件中使用 self.abc 可以调用成员变量的 setter、getter 函数,直接调用成员变量名称 abc 就为访问该变量的指针,对成员变量直接赋值等同于 ASSIGN 效果。
参考链接:http://www.cnblogs.com/AnnieBabygn/p/5335350.html
iOS 中的成员变量, 实例变量, 属性变量
来源: http://www.bubuko.com/infodetail-2273303.html