初识Objecive-C 之 属性

1、实例变量的作用域 (即访问修饰符):

@public     公有的,该实例变量谁都可以访问

@private 私有的,该实例变量只能在该类中访问,其他类中不能访问

@protected受保护的,该实例变量只能在该类和其子类内访问,其他内不能访问,没有声明就是默认此属性

2、为了封装和安全的需要引入setter和getter方法

-(void)setName:(NSString)newName;//name的set方法

- (NSString *)name //name的get方法

其中getter方法不可以是- (NSString)getName;而是- (NSString *)name;

3、设置器和访问器即getter和setter

①在setter中可以加入合法性检查。如 学生的年龄不会是负数的   age<0?0:age;

②更新与被设置变量相关的其他变量值。如 在深水中 改变深度 相应的更新它的压强

③在debug时,在setter中加入追踪log。

④在多线程环境中,如果要保护对象的并发访问,则必须在getter/setter中加入同步锁。

4、形参的函数中":"是函数的一部分

如:

-(id)initWithName:(NSString)newName;

-(id)initWithName;

如果没有冒号就是一样的函数

5、属性 @property @synthesize

我们用@property代替了声明中的setter和getter方法;@synthesize代替了实现中的setter和getter方法。

如 

@property NSString *name,*address,*hobby;

@synthesize name,address,hobby;

如果我们注释了@synthesize中得内容,那么编译器会自动生成加下划线的实例变量 如 _name;

6、点语法 

 Student *stu = [[Student alloc] init];
// [stu setAge:22];
stu.age=22;
stu.name=@"小詹詹";
stu.hobby=@"旅游";
NSLog(@"I am %@,this year of the age is %d,my bobby is %@",stu.name,stu.age,stu.hobby);

其中调用[stu setAge:22]方法和stu.age=22的赋值是一样的 后者的age是一个调用的是setAge这个方法,

输出stu.name这里的name并不是赋值 所以这里调用的是name的getName方法。

7、property的有关语法

①自定义setter和getter方法 如下

@property(setter=newSetName:) NSString *name;

@property(getter=getName) NSString *name;

②可读写性

@property(readwrite) NSString *name;//默认属性 可读写

@property(readonly) NSString *name;//只读属性系统只会产生getter方法而不会产生setter方法

③线程安全与内存管理

@property(nonatomic,retain) NSString *name;

@property(nonatomic,assign) int age;

线程包括atomic、nonatomic

atomic:在多线程访问时保证线程的安全。如 同时多个窗口卖火车票 保证同一张票只能卖给一个人。

nontomic:不保证线程的安全性。系统默认的。

内存管理先了解 assign and retain

assign:表明简单的赋值方法,也是默认的方式,它不关心内存管理。一般的数据类型用assign。

retain:关心内存管理。指针类型用retain。

eg:

Student.h

import <Foundation/Foundation.h>

@interface Student : NSObject
{
// NSString *name;
// int age;
// NSString *hobby;
// NSString *address;
}
@property (nonatomic,retain) NSString *name,*hobby,*address;
@property (nonatomic,assign,setter = newAge:) int age;
//- (void) setName:(NSString *)n;
//- (NSString *) name;
//
//- (void) setAge:(int)a;
//- (int) age;
//
//- (void) setHobby:(NSString *)h;
//- (NSString *) hobby;
//
//- (void) setAddress:(NSString *)ad;
//- (NSString *) address;
-(void)newAge:(int)anAge;
+(id)studentName:(NSString*)aName
andAge:(int)anAge
andHobby:(NSString*)Hob
andAdd:(NSString*)add;

@end

Student.m

#import "Student.h"

@implementation Student
@synthesize name,age,hobby,address;
//- (NSString *) name{
// return name;
//}
//- (int) age{
// return age;
//}
//- (NSString *) hobby{
// return hobby;
//}
//- (NSString *) address{
// return address;
//}
//- (void) setName:(NSString *)n{
// name=n;
//}
//- (void) setAge:(int)a{
// age=a;
//}
//- (void) setHobby:(NSString *)h{
// hobby=h;
//}
//- (void) setAddress:(NSString *)ad{
// address=ad;
//}
+(id)studentName:(NSString*)aName
andAge:(int)anAge
andHobby:(NSString*)Hob
andAdd:(NSString*)add{
Student *stu=[[Student alloc]init];
stu.name=aName;
stu.age=anAge;
stu.hobby=Hob;
stu.address=add;
return [stu autorelease];
}
-(void)newAge:(int)anAge{
if (anAge>100||anAge<0) {
age=18;
}else{
age=anAge;
}
}
@end


main.m

#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[])
{

@autoreleasepool {
Student *stu = [[Student alloc] init];
[stu setName:@"小虫"];
[stu newAge:101];
[stu setHobby:@"编程"];
[stu setAddress:@"Xiamen"];
NSLog(@"my name is %@,age is %d,my hobby is %@,my address is %@",[stu name],[stu age],[stu hobby],[stu address]);
Student *stu1 = [Student studentName:@"XiaoZZ" andAge:-2 andHobby:@"singsong" andAdd:@"hannan"];
NSLog(@"my name is %@,age is %d,my hobby is %@,my address is %@",[stu1 name],[stu1 age],[stu1 hobby],[stu1 address]);
}
return 0;
}



2013-10-12 19:59:03.294 编程题[1046:303] my name is 小虫,age is 18,my hobby is 编程,my address is Xiamen
2013-10-12 19:59:03.297 编程题[1046:303] my name is XiaoZZ,age is 18,my hobby is singsong,my address is hannan

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值