属性

来源:互联网 发布:知乎搜索引擎 编辑:程序博客网 时间:2024/04/29 17:08

 

1.设置器、访问器作用:隐藏成员变量,保证成员变量安全。添加业务逻辑,作正确性检验(例子:年龄必须正整数。某项活动需要定时对积分条件修改)。控制读写性。

2.设置器、访问器实现方法(手动实现)

-(void) setAge:(int)newAge

{

_age = newAge;

}

-(int) age

{

return _age;

}

3.标签:#pragma mark -内容-

4.@作用:输出字符串。输出对象描述。

5.属性@property:表示某一对象的特征,可以供外界使用访问。有帮助声明设置器和访问器的作用,好处代码简短,常用。

6.属性功能

  1. 访问控制:readwrite、readonly。getter 、setter 自定义要用的方法。
  2. 线程安全:nonatomic非原子性,不保证多线程安全,但加快属性值的存取速度。
    •       atomic原子性,默认值,多线程访问时较安全(原子性操作叫做一次性操作,要么成功,要么失败)
  3. 内存控制:   copy、assign默认值,用于基本数据类型、retain用于对象类型、strong

7._age是供类以内的变量,不供类以外。属性是供类外的(@property int age;),其原理就像小名只供家人使用,在外面必须使用全名。

8.@synthesize:组合属性,生成相应的访问器和设置器和成员变量。(属性 = 设置器 、访问器)

9.@synthesize是系统自动实现的,好处代码简短,缺点不支持编写业务逻辑。需添加业务逻辑,只能用手动实现。

10.点语法:点属性。

11.OC中任何操作都需要找对象。self本类对象,代表指向当前实例对象的指针。super父类对象,代表指向父类对象的指针。

12.方法里头1个冒号:对应一个参数,参数都是以a开头(如aName)

13.定义属性时,什么情况使用copyassignretain

  • 使用assign: 对基础数据类型 NSIntegerCGFloat)和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