在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” 实例变量不能放在类别中。
网友评论