• 属性


    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(@"%@吃饭
    ",_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

  • 相关阅读:
    JavaWeb网站技术架构
    fullcalendar插件日程管理
    PuTTY/终端使用复制、粘贴
    JAVA PERSISTENCE API (JPA)
    mysql查询当天所有数据sql语句
    Sign http
    js在新页面中返回到上一页浏览的历史位置
    Android使用Activity用作弹出式对话框
    android listview局部刷新和模拟应用下载
    如何获取drawable目录下的图片绝对路径
  • 原文地址:https://www.cnblogs.com/huen/p/3507357.html
Copyright © 2020-2023  润新知