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