1.设置器、访问器作用:隐藏成员变量,保证成员变量安全。添加业务逻辑,作正确性检验(例子:年龄必须正整数。某项活动需要定时对积分条件修改)。控制读写性。
2.设置器、访问器实现方法(手动实现)
-(void) setAge:(int)newAge
{
_age = newAge;
}
-(int) age
{
return _age;
}
3.标签:#pragma mark -内容-
4.@作用:输出字符串。输出对象描述。
5.属性@property:表示某一对象的特征,可以供外界使用访问。有帮助声明设置器和访问器的作用,好处代码简短,常用。
6.属性功能
- 访问控制:readwrite、readonly。getter 、setter 自定义要用的方法。
- 线程安全:nonatomic非原子性,不加锁,不保证多线程安全,但加快属性值的存取速度。
- atomic原子性,默认值,多线程访问时较安全(原子性操作叫做一次性操作,要么成功,要么失败)
- 内存控制: weak、 copy、(assign默认值)用于基本数据类型。retain、(strong默认值)用于对象类型。
- ARC下属性的关系有两种主要类型:strong和weak,相当于非ARC环境中的retain和assign,只要存在一个强引用对象就会一直存在,不会被销毁。而weak在引用的对象被销毁后,weak的引用会被自动置为nil,所以delegate的属性总是应该声明为weak。
7._age是供类以内的变量,不供类以外。属性是供类外的(@property int age;),其原理就像小名只供家人使用,在外面必须使用全名。
8.@synthesize:组合属性,生成相应的访问器和设置器和成员变量。(属性 = 设置器 、访问器)
9.@synthesize是系统自动实现的,好处代码简短,缺点不支持编写业务逻辑。需添加业务逻辑,只能用手动实现。
10.点语法:点属性。
11.OC中任何操作都需要找对象。self本类对象,代表指向当前实例对象的指针。super父类对象,代表指向父类对象的指针。
12.方法里头1个冒号:对应一个参数,参数都是以a开头(如aName)
13.定义属性时,什么情况使用copy、assign、retain?
- 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
- 使用copy: 希望获得源对象的副本而不改变源对象内容时,对NSString、自定义的Block
- 使用retain: 希望获得源对象的所有权时,对其他NSObject和其子类
Student.h
@interface Student : NSObject { int _age; NSString *_name; NSString *_address; } //void setAge(int newAge); //设置器和访问器 //-(void) setAge:(int)newAge; //-(int) age; @property(assign,nonatomic,readwrite,setter = settingAge:) int age;//属性功能 @property(retain,nonatomic,readwrite) NSString *name; -(void) eat; -(Student *)initWithName:(NSString *)aName; -(Student *)initWithName:(NSString *)aName Age:(int)aAge; @end
Student.m
#import "Student.h" @implementation Student //标签:#pragma mark -内容- #pragma mark -age 的设置器、访问器- -(void) settingAge:(int)anAge { _age = anAge; } -(void) setAge:(int)newAge { if (newAge < 0) { newAge = 0; } _age = newAge; } -(int) age { return _age; } //@synthesize age = _age;//对类外和类内的有关系,标准写法 @synthesize name = _name; #pragma mark -对象方法- -(void) eat { NSLog(@"%@吃饭 ",_name); } //系统默认的初始方法(构造方法)............................... -(Student *)init { self = [super init];//父类初始化返回对象 if (self) //存在 { } return self; } -(Student *)initWithName:(NSString *)aName { self = [super init];//调用父类方法 if(self) { //_name = aName; _name全局变量,危险 self.name = aName; } return self; } -(Student *)initWithName:(NSString *)aName Age:(int)aAge { self = [super init]; if (self) { self.name = aName; self.age = aAge; } return self; } @end
AppDelegate.m
#import "AppDelegate.h" #import "Student.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; Student *stu = [[Student alloc]init]; //[stu setAge:-10];//通过设计器设置年龄 stu.age = -10; printf("年龄%d ",[stu age]);//通过访问器访问年龄 NSLog(@"%d岁",stu.age); //自动换行 //............................................................... Student *stu1 = [[Student alloc]initWithName:@"bill"];//stu1、self指向内存 NSLog(@"myname is %@ ",stu1.name); [self.window makeKeyAndVisible]; return YES; }
strong
weak