属性

 

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. 内存控制:  weak、 copy、(assign默认值)用于基本数据类型。retain、(strong默认值)用于对象类型。
  4. 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.定义属性时,什么情况使用copyassignretain

  • 使用assign: 对基础数据类型 NSIntegerCGFloat)和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(@"%@吃饭\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;
}

 strong

weak

posted @ 2014-01-07 08:19  forrHuen  阅读(272)  评论(0编辑  收藏  举报