属性
来源:互联网 发布:知乎搜索引擎 编辑:程序博客网 时间:2024/04/29 17:08
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原子性,默认值,多线程访问时较安全(原子性操作叫做一次性操作,要么成功,要么失败)
- 内存控制: copy、assign默认值,用于基本数据类型、retain用于对象类型、strong
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
- 使用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(@"%@吃饭\n",_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\n",[stu age]);//通过访问器访问年龄 NSLog(@"%d岁",stu.age); //自动换行 //............................................................... Student *stu1 = [[Student alloc]initWithName:@"bill"];//stu1、self指向内存 NSLog(@"myname is %@\n",stu1.name); [self.window makeKeyAndVisible]; return YES;}
0 0