• oc-27-@property的参数


    //01加强-10
    
    @property 4.4前
    
    1) @property + 手动实现
    2) @property int age; + @synthesize age;//get和set方法的声明和实现都帮我们做了
    3) @property int age + @synthesizes age = _b;
    @property 4.4增强 .h
    
    @property int age;
    1) 生成_age
    2) 生成_age的get和set方法的声明
    3) 实现_age的get和set方法
    
    
    // 基本数据类型
    int _age;
    // set方法的写法
    -(void)setAge:(int) age
    {
    _age = age;
    }
    
    // 用assign修饰后,仍旧会生成以上标准的set方法
    @property (assign) int age;
    
    // oc对象类型
    @property (retain) Car *car ;
    // 用retain修饰后,生成如下内存管理代码
    -(void)setCar:(int) car
    {
    if(_car ! = car)
    {
    [_car release];
    _car = [car retain];
    }
    }
    
    1.内存管理相关参数
    retain : release旧值,retain新值(用于OC对象)
    assign : 直接赋值,不做任何内存管理(默认,用于非OC对象类型)
    copy : release旧值,copy新值(一般用于NSString *//使用@property增强型 生成get和set方法
    @property(nonatomic,retain)Car *car;
    //.m文件中实际上生成的是
    - (void)setCar:(Car *)cat
    {
    if(_car != car)
    {
    [_car release];
    _car = [car retain];
    }
    }
    
    
    1.@property 参数(二)
    1、是否要生成set方法(若为只读属性,则不生成)
    readonly:只读,只会生成get的声明和实现
    readwrite:默认的,同时生成set和get的声明和实现
    2.多线程管理(苹果在一定程度上屏蔽了多线程操作)
    nonatomic:高性能,一般使用这个
    atomic:低性能,默认
    atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
    3.set和get方法的名称
    修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改 名称一般用在布尔类型中的getter。
    控制set方法和get方法的名称
    setter : 设置set方法的名称,一定有个冒号:
    getter : 设置get方法的名称
    @property(nonatomic,assign, setter=abc:,getter=haha)int age
    Gamer.h
    
    #import <Foundation/Foundation.h>
    #import "House.h"
    
    @interface Gamer : NSObject
    //{
    //    House *_house; // 房间
    //}
    //- (void)setHouse:(House *)house;
    //- (House *)house;
    
    
    // @property的完整格式
    // @property(参数,参数)成员变量类型 成员变量名称(去掉下划线);
    
    //     retain:参数用于对象类型,能够帮我们生成set方法的内存管理代码.
    //     assign:参数,用于基本数据类型,不做内存管理代码.
    
    //     atomic:对线程加锁,性能低,安全性高(默认).
    //     nonatomic:不对线程加锁,性能高,安全性低.手机端,建议使用nonatomic
    
    //     readonly:只能操作,只给外界提供get方法,不提供set方法.
    //     readwirte:可读可写.
    
    //     setter:改set方法的名字
    //     getter:改get方法的名字
    
    @property (nonatomic,retain)House *house;//对象类型用retain
    // 外界可以读写.如果,只让外界读取,不能写入时,
    @property (atomic,assign,readonly)int age;//基本类型用assign
    // 判断玩家是否是vip
    //BOOL res = game.isVip;
    //BOOL res1 = [game isVip];
    @property(nonatomic,assign,getter=isVip,setter=noVip:)BOOL vip;
    @end
    
    
    Gamer.m
    
    #import "Gamer.h"
    
    @implementation Gamer
    - (void)dealloc
    {
        NSLog(@"玩家被释放");
        // 当玩家自己被回收时,对房间进行一次release操作.
        [_house release];
        [super dealloc];
    }
    //@property已经做了内存管理,下面就不要内存管理了。
    //- (void)setAge:(int)age //{ // _age = age; //} //- (void)setHouse:(House *)house //{ // if (_house != house) { // //当玩家换房间时,需要对旧房间做一次release操作 // [_house release]; // // 玩家要进入房间,玩家就要对房间进行一次retain操作. // _house = [house retain]; // } // //} //- (House *)house //{ // return _house; //} @end House.h #import <Foundation/Foundation.h> @interface House : NSObject @property int no; @end House.m #import "House.h" @implementation House - (void)dealloc { NSLog(@"%d房间被释放了",_no); [super dealloc]; } @end main.m #import <Foundation/Foundation.h> #import "Gamer.h" int main(int argc, const char * argv[]) { @autoreleasepool { Gamer *game = [[Gamer alloc] init]; BOOL res = game.isVip; BOOL res1 = [game isVip]; [game noVip:YES]; } return 0; } void demo1(){ Gamer *g = [[Gamer alloc] init]; g.age = 10; NSLog(@"%d",g.age); House *h = [[House alloc] init]; g.house = h; [g release]; [h release]; } void demo() { // 创建1个玩家 Gamer *gamer = [[Gamer alloc] init]; // 玩家1 // 创建1个房间 House *house1 = [[House alloc] init]; // 房间1 1 house1.no = 10; // 创建第二个房间 House *house2 = [[House alloc] init]; // 房间2 1 house2.no = 20; // 玩家进入房间 gamer.house = house1; // 房间 2 gamer.house = house2; // 2号房间 2 [house1 release]; // 房间 1 // 房间1被释放 [house2 release]; // 房间2 1 // gamer.house = house1; // 操作僵尸对象 // gamer.house = house2; [gamer release]; }
  • 相关阅读:
    http参数传递方式
    Api接口管理工具推荐
    IntelliJ IDEA 插件推荐
    spring服务器接收参数格式
    SSM框架的常用注解整理
    Java map 详解
    遍历Map集合四中方法
    bean对应mapper.xml字段
    Java简历与面试
    SQL的case when then else end语句的用法
  • 原文地址:https://www.cnblogs.com/yaowen/p/5314235.html
Copyright © 2020-2023  润新知