iOS学习 --- 成员变量,实例变量,属性

iOS学习 --- 成员变量,实例变量,属性
  • 成员变量:
  1. 成员变量用于类内部,无需与外界接触的变量,也就是所谓的类的私有变量。
  2. 默认是 @proteced 修饰的。
  3. 成员变量不会自动生成set /get方法,需要自己手动实现。
  4. 成员变量不能用点语法,因为没有set/get方法,只能使用 -> 调用。
  5. 在{ }中声明的变量都是成员变量,如果变量的数据类型是一个类,则称这个变量为实例变量,因此实例变量是成员变量的一种特殊情况。

分析下面代码:

@interface MyViewController :UIViewController
{
    //成员变量,实例变量
    UIButton *yourButton; 
    //成员变量
    int count; 
    //成员变量,实例变量
    id data; 
} 
  1. 在{ }中声明的变量都是成员变量,所以上面yourButton,count,data都是成员变量。
  2. yourButton的数据类型是 UIButton ,是类,所以yourButton也是实例变量;,本质上讲id等同于(void *),所以id data 属于实例变量。?????
  •  属性:
  1. 属性变量是用于和其他对象交互的变量,属性变量的好处就是允许让其他对象访问该变量(因为属性创建的过程中自动生成了set 和get方法)。
  2. 对于属性变量,一般把需要与外部接触的变量定义在.h文件中,只在本类中使用的变量定义在.m文件中。
  3. 属性的默认修饰符是 @protected 。
  4. 属性会自动生成set 和get 方法。
  5. 属性可以用点语法调用,点语法实际上调用的是set和get方法。
  6. 用 @property 声明的属性,编译器会自动生成一个以 下划线开头的实例变量。

分析下面代码

@interface MyViewController :UIViewController
//属性变量
@property (nonatomic, strong) UIButton *myButton;

@end
  1. 上面代码声明的属性myButton,在创建的时候编译器会自动生成一个实例变量 _myButton ,同时也会自动生成set和get方法,不需要自己手动再去写实例变量,也不需要在 .m 文件中写 @synthesize myButton 。
  2. 如果在.m中写了@synthesize myButton ,那么生成的实例变量就是myButton,如果没写@synthesize myButton,那么生成的实例变量就是_myButton。
注意:
@synthesize的作用:
(1)让编译器为你自动生成setter与getter方法。
(2)可以指定与属性对应的实例变量,例如@synthesize myButton = xxx;那么self.myButton其实是操作的实例变量xxx,而不是_myButton了。
  • 实例变量
  1. 实例变量本质上就是成员变量,只是实例变量是针对类而言的。
  2. 实例变量是由类定义的变量,除去基本数据类型 int float ...等,其他类型的变量都叫做实例变量。
  3. *** 实例变量 + 基本数据类型变量 = 成员变量
  • 类别中的属性(重点)
类别中只能添加实例方法、类方法、属性,甚至可以实现协议,不能添加实例变量(或者说成员变量)。
经常会在类别中看到类似下面的代码,在类别中用@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));
}

相关文章: