@property预编译指令的作用是自动声明属性的setter和getter方法。
@synthesize也是一种新的编译器功能,它表示“创建了该属性的访问代码”。当遇到@synthesize rainHandling;这行代码时,编译器将添加实现-setRainHandling:和-rainHandling方法的预编译代码。
有两个地方可以用来添加实例变量声明:头文件和实现文件。我们甚至可以拆开来,一部分在头文件中声明,一部分在实现文件中声明。
那么变量的声明语句放在这两个地方有什么区别呢?假设你有一个子类,并且想要从子类直接通过属性来访问变量。在这种情况下,变量就必须放在头文件中。如果变量只属于当前类,则可以把它们放在.m文件里(并且要删除原interface代码中的声明语句)。并且,如果没有指定实例变量,编译器会自动帮我们创建。
点表达式(.)和C语言中的结构体访问以及Java语言中的对象访问有些相似。如果点表达式出现在了等号(=)左边,该变量名称的setter方法(-setRainHandling:和-setSnowHandling:)将会被调用。如果点表达式出现在了对象变量的右边,则该变量名称的getter方法(-rainHandling和-snowHandling)将被调用。
self.name的意思:该语句的作用是消除歧义,使编译器知道我们会用访问方式来读取变量。如果只使用普通的name,编译器会误以为我们要修改这个名为name 的实例变量。如果要使用访问方法来进行赋值,可以写成[self setName:@"Car"]。请记住,点表示法只是调用相同方法的便捷方式,所以self.name = @“Car"只不过是实现同样内容的另一种写法。
在属性声明中,如果你不想保留某个变量对象,可以使用assign特性,这样可以避免发生保留死循环。如果你没有为属性指定任何特性,它们会默认使用nonatomic和assign。你也可以为可保留的指针(即Objective-C对象)指定retain和copy特性,而其他C类型和不可保留的指针必须使用assign特性并且要手动来管理内存。
copy特性意味着当我们给name赋值的时候,Car类会创建这条字符串的副本并将其存储下来。(@property (copy)NSString *name;)
@dynamic关键字告诉编译器不要生成任何代码或创建相应地实例变量。
考虑如下代码:
@interface MyClass:NSObject{
MyObject *_myObject;
}
@property(nonamtic,retain)MyObject *myObject;
@end
@implementation MyClass
@synthesize myObject = _myObject;
以上代码中:
@synthesize myObject = _myObject的含义就是属性myObject的存取方法是作用于_myObject这个变量的。