iOS中成员变量和属性的区别

在OC开发中我们会用到属性和成员变量,也知道两者是有区别,但是区别到底是什么呢?在这里我们详细说一下

在ios第一版中:
  我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如:

注意:(这个是以前的用法)
@interface MyViewController :UIViewController
{
    UIButton *myButton;
}
@property (nonatomic, retain) UIButton *myButton;
@end

在现在iOS版本中:
  苹果将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。如果LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。因此,在这个版本中,我们不再为输出口声明实例变量。

@interface MyViewController :UIViewController
@property (nonatomic, retain) UIButton *myButton;
@end

@property声明的属性不仅仅默认给我们生成一个_类型的成员变量(类别和协议中除外,下面会讲到),同时也会生成setter/getter方法.所以我们没有必要再去写@synthesize方法,当然我们也可以去写。
@synthesize的作用:
(1)让编译器为你自动生成setter与getter方法。
(2)可以指定与属性对应的实例变量,例如@synthesize myButton = xxx;那么self.myButton其实是操作的实例变量xxx,而不是_myButton了。

@interface MyViewController :UIViewController
{
    NSString *name;
}
@end

在这段代码里面只是声明了一个成员变量,并没有setter/getter方法。所以访问成员变量时,可以直接访问name,也可以像C++一样用self->name来访问,但绝对不能用self.name来访问。
如果我们想要点语法调用,那么需要写他的set和get方法,比如下面这样。

-(void)setTitle:(NSString*)title{
    self->title = title;
}
-(NSString*)title{
    return self->title;
}

实例变量

实例变量: class类进行实例化出来的对象为实例对象;比如:

Person *p = [Person new];

属性变量

属性变量@property: 属性是与其他对象交互的变量,一般如果我们在本类中添加属性变量的话会生成默认的setter和getter方法和成员变量。
注意:

  • 分类中添加的属性是不会自动生成setter和getter方法的,必须要手动添加。分类中不能实现成员变量。
  • 协议中添加的属性我们可在类中添加@synthesize,来添加成员变量和set、get方法、

成员变量

成员变量: 在{ }中所声明的变量都是成员变量(实例变量是一种特殊的成员变量)。其中的hell、btn也是实例对象,id是一种特殊的class,是OC特有的对象。成员变量是私有变量,外部不会获取到。

@interface Person : NSObject{
    @public
    NSString *myName; //成员
    id hell; // id - > class
    UIButton *btn;
    int age;
}

另外协议中属性变量也可以生成成员变量,但是分类中的属性变量不能生成成员变量。
如果我们往类别中添加成员变量的话

@interface Man (category)
{
    NSString * ccc;
}

@property (nonatomic,strong)NSString * categotyProperty;
@end

会报错 “Instance variables may not be placed in categories” 实例变量不能放在类别中。

你可能感兴趣的:(iOS中成员变量和属性的区别)