<span style="font-size:14px;">/在这里,我们可以使用点语法来访问属性,点语法被称为"语法糖果",它只是为了方便我们书写,它的本质还是getter和setter语法</span>
main.m
<span style="font-size:14px;">#import <Foundation/Foundation.h>
#import "NewStudent.h"
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
NewStudent *newStudent = [[NewStudent alloc]init];
// [newStudent setName:@"Rick"]
newStudent.name = @"Rick";
// newStudent.age = 25;
newStudent.homeAddress = @"GZ";
NewStudent *newStudent1 =[[NewStudent alloc]initWithName:@"Rick" andAge:25 andHomeAddress:@"GZ"];
}
return 0;
} </span>
NewStudent.h
<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface NewStudent : NSObject
//{
// NSString *_homeAddress ;
// NSString *_name ;
// NSInteger _age;
//}
//对于homeAddress来说
//-(void)setHome:(NSString *)homeAddress ;
//-(NSString *)homeAddress ;
//属性的声明
//@property NSString *homeAddress ;
//相当于声明了设置器和访问器
//-(void)setHome:(NSString *)homeAddress ;
//-(NSString *)homeAddress ;
/*
访问读写,原子性,内存管理
访问读写:readwrite 指明属性是可读写的,这是默认值,因此可以省略。
readonly 指明属性是只读的,系统只会产生getter方法,而不会产生setter方法
可读写性确定属性是否有setter方法,他们是互斥的
对于只读的属性,如果试图通过点语法给其赋值,会编译错误
原子性:atomic 原子性操作,这是默认的
nonatomic 非原子性操作,一般就使用nonatomic,但是它没有办法保证在多线程环境下出错
内存管理
retain 会通过retain来持有目标对象,之前的对象会接收到释放的消息
copy 会通过copy复制对象,之前的对象会接收到释放的消息
assign 表明采用简单的赋值方式,这是默认的方式
strong 表示强引用关系,即拥有目标对象的所有权
weak 表示弱引用关系,不用有目标对象的所有权。当目标对象被销毁,属性值会自动设置为nil
strong 相当于 retain 或者 copy,对象要用retain,copy,strong来描述
weak 相当于 assign ,基本数据类型要用assign 来描述
*/
//@property 的设置器声明,这里没有下划线
//注意:直接操作实例变量而没有进行retain或copy操作,可能会引起内存泄露或者引用技术错误
@property (readwrite,nonatomic,strong) NSString *homeAddress ;
@property (readwrite,nonatomic,strong)NSString *name ;
@property(readonly,nonatomic,assign)NSInteger age;
-(id)initWithName:(NSString *)name
andAge:(NSInteger)age
andHomeAddress:(NSString *)homeAddress ;
@end </span>
NewStudent.m
<pre name="code" class="objc"><span style="font-size:14px;">#import "NewStudent.h"
@implementation NewStudent
//相当于设置器和访问器实现
//属性的实现,这句话也可以省略
//@synthesize homeAddress = _homeAddress;
/*
注意:如果我们把@synthesize注释掉了,这时候系统会为我们自动生成以下下划线开头的变量。所以在类实现文件的内部,我们需要_name来代替name,用_age来代替age
*/
//-(void)setHome:(NSString *)homeAddress{
// _homeAddress = homeAddress;
//}
//
//-(NSString *)homeAddress{
// return _homeAddress;
//}
-(id)initWithName:(NSString *)name
andAge:(NSInteger)age
andhomeAddress:(NSString *)homeAddress{
if (self = [super init]) {
// _name = name;
// _age = age;
// _homeAddress = homeAddress;
//对于只读readonly来讲,不能用self.age,因为它没有设置器
//对于可读可写通常使用self.name的这种方法
self.name = name;
// self.age = age;
_age = age;
self.homeAddress = homeAddress;
}
return self;
}
-(void)sayGoodBy{
NSLog(@"My name is %@,I am is %ld, My home is %@",_name,_age,_homeAddress);
}
@end</span>