iOS学习 --- 成员变量,实例变量,属性
- 成员变量:
- 成员变量用于类内部,无需与外界接触的变量,也就是所谓的类的私有变量。
- 默认是 @proteced 修饰的。
- 成员变量不会自动生成set /get方法,需要自己手动实现。
- 成员变量不能用点语法,因为没有set/get方法,只能使用 -> 调用。
- 在{ }中声明的变量都是成员变量,如果变量的数据类型是一个类,则称这个变量为实例变量,因此实例变量是成员变量的一种特殊情况。
分析下面代码:
@interface MyViewController :UIViewController
{
//成员变量,实例变量
UIButton *yourButton;
//成员变量
int count;
//成员变量,实例变量
id data;
}
- 在{ }中声明的变量都是成员变量,所以上面yourButton,count,data都是成员变量。
- yourButton的数据类型是 UIButton ,是类,所以yourButton也是实例变量;,本质上讲id等同于(void *),所以id data 属于实例变量。?????
- 属性:
- 属性变量是用于和其他对象交互的变量,属性变量的好处就是允许让其他对象访问该变量(因为属性创建的过程中自动生成了set 和get方法)。
- 对于属性变量,一般把需要与外部接触的变量定义在.h文件中,只在本类中使用的变量定义在.m文件中。
- 属性的默认修饰符是 @protected 。
- 属性会自动生成set 和get 方法。
- 属性可以用点语法调用,点语法实际上调用的是set和get方法。
- 用 @property 声明的属性,编译器会自动生成一个以 下划线开头的实例变量。
分析下面代码
@interface MyViewController :UIViewController
//属性变量
@property (nonatomic, strong) UIButton *myButton;
@end
- 上面代码声明的属性myButton,在创建的时候编译器会自动生成一个实例变量 _myButton ,同时也会自动生成set和get方法,不需要自己手动再去写实例变量,也不需要在 .m 文件中写 @synthesize myButton 。
- 如果在.m中写了@synthesize myButton ,那么生成的实例变量就是myButton,如果没写@synthesize myButton,那么生成的实例变量就是_myButton。
注意:
@synthesize的作用:
(1)让编译器为你自动生成setter与getter方法。
(2)可以指定与属性对应的实例变量,例如@synthesize myButton = xxx;那么self.myButton其实是操作的实例变量xxx,而不是_myButton了。
- 实例变量
- 实例变量本质上就是成员变量,只是实例变量是针对类而言的。
- 实例变量是由类定义的变量,除去基本数据类型 int float ...等,其他类型的变量都叫做实例变量。
- *** 实例变量 + 基本数据类型变量 = 成员变量
- 类别中的属性(重点)
类别中只能添加实例方法、类方法、属性,甚至可以实现协议,不能添加实例变量(或者说成员变量)。
经常会在类别中看到类似下面的代码,在类别中用@property添加属性aKeyPushView和aKeyButton,这种情况下不能生成对应的实例变量_aKeyPushView和_aKeyButton,也不能生成get和set方法。所以尽管添加了属性,也不能点语法调用get和set方法。
#import "AppDelegate.h"
@interface AppDelegate (XGPush)
//推送
//声明属性
@property (nonatomic, strong) UIView *aKeyPushView;
@property (nonatomic, strong) UIbutton *aKeyButton;
/**
XGPush 注册
@param launchOptions 启动项
*/
-(void)registerXGPush:(NSDictionary *)launchOptions;
@end
****注意一点,匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法),常用的扩展是在.m文件中声明私有属性和方法。 Category理论上不能添加变量,但是可以使用Runtime机制来弥补这种不足。????
#import "AppDelegate+XGPush.h"
@interface AppDelegate ()
@end
@implementation AppDelegate (XGPush)
#pragma mark --- Associated Object
-(void)setAKeyPushView:(UIView *)aKeyPushView{
objc_setAssociatedObject(self, @selector(aKeyPushView), aKeyPushView,OBJC_ASSOCIATION_RETAIN);
}
-(UIView *)aKeyPushView{
return objc_getAssociatedObject(self, @selector(aKeyPushView));
}
-(void)setAppProgressView:(UIButton *)aKeyButton{
objc_setAssociatedObject(self, @selector(aKeyButton), aKeyButton,OBJC_ASSOCIATION_RETAIN);
}
-(UIButton *) aKeyButton{
return objc_getAssociatedObject(self, @selector(aKeyButton));
}
相关文章: