Farlanki

Objective-C中的@property和@ synthesize

字数统计: 547阅读时长: 2 min
2015/12/02 Share

@property

@property在Objective-C中的作用是生成存取方法.当存取方法被生成后,就可以使用形如 实例名.属性名这种格式来访问实例变量.虽然这种方式和C++的访问对象成员的形式很像,但是在ObjC中的这种方法其实是调用了实例的存取方法而已.所以

1
myCar.type = "SUV";

这种写法其实是与

1
[myCar setType:@"SUV"];

等价.

@synthesize

@synthesize是将存取方法和变量关联起来.

  • 如果写入这样的代码:
  • 1
    @synthesize type = _type

那么就是将实例变量_type和存取方法关联起来.我们可以这么用:

1
_type = "SUV"
  • 第二种情况:
  • 1
    @synthesize type

那么,关联的实例变量就是type

1
type = "SUV"
  • 从Xcode4.4开始,@synthesize不用手动添加,因为系统会自动添加.情况和第一种情况一样,即系统将自动添加
  • 1
    _type = "SUV"

假如 property 名为 foo,存在一个名为 _foo 的实例变量,那么将不会合成新的变量.

1
2
3
4
@interface myClass : NSObject
@property (nonatomic) int myInt;
@property (nonatomic) int _myInt;
@end

提示:Auto property synthesis will not synthesize property ‘_myInt’ because it cannot share an ivar with another synthesized property.

在interface大括号中声明的变量

interface大括号中声明的变量和@property中声明的属性有什么不同呢?

  • interface大括号中声明的变量不能在类外访问,而属性可以在类外访问.
  • property中声明的属性,系统会自动生成getter,setter.也可以手动添加getter,setter.
1
2
3
4
5
6
7
8
9
10
@interface myClass : NSObject
{
NSString *name;
}
@property(nonatomic) NSString *name;
@end

@implementation myClass
@synthesize myClass;
@end

此时生成的myClass类的对象拥有一个ivar:name.

1
2
3
4
5
6
7
8
9
10
@interface myClass : NSObject
{
NSString *name;
}
@property(nonatomic) NSString *name;
@end

@implementation myClass
@synthesize name = _name;
@end

此时生成的myClass类的对象拥有两个ivar:name_name.使用点运算符访问到的将是_name.

注意,在特定情况下,推荐使用点运算符或者访问方法来访问变量:

  • 在非ARC的情况下,使用属性会自动生成retain/release的代码.
  • 如果属性被atomic修饰,使用属性会提供线程安全的功能,然而直接访问ivar不是线程安全的.
CATALOG
  1. 1. @property
  2. 2. @synthesize
  3. 3. 在interface大括号中声明的变量