IOS学习笔记-属性

@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特性,这样可以避免发生保留死循环。如果你没有为属性指定任何特性,它们会默认使用nonatomicassign。你也可以为可保留的指针(即Objective-C对象)指定retaincopy特性,而其他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这个变量的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值