黑马程序员-ios学习笔记 oc @property

本文详细介绍了Objective-C中的@property关键字,包括其基本概念、用法、参数说明,如atomic与nonatomic的区别、读写属性的设定、setter与getter的自定义以及retain、copy、assign、weak和strong等修饰符的用途。通过实例解析了如何使用@property声明和管理对象属性,尤其关注了在多线程环境和内存管理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

oc的@property关键字

一,基本概念:@property是编译器的指令; 编译器的指令即是用来告诉编译器要做什么。     

1、@property告诉编译器声明属性的访问器(getter/setter)方法。

2、与@synthesize配对使用。xcode4.5以及以后的版本,@synthesize可以省略

好处:免去手工书写get和set方法繁锁的代码。

二、@property的用法

1、声明格式:@property    类型    方法名;

2、声明格式:@property (参数1,参数2....) 类型 方法名; 

参数:1)原子性:atomic : 对属性加锁,多线程下线程安全,默认值;

                               nonatomic  : 对属性不加锁,多线程下不安全,但速度快;

            2)读写属性:readwrite : 生成getter、setter方法,默认值;

                                   readonly  :只生成getter方法

            3)set方法处理:assign : 直接赋值,默认值;(适用于非oc对象类型) 

                                    retain :  先release原来的值,再retain新值;—>(在MRC中使用,适用于OC对象类型) 

                                    copy :  先release原来的值,再copy新值。(一般用于NSString)

                                    weak:  弱指针—>(在ARC中使用,适用于oc对象类型,相当于MRC中的assign)

                                    strong:强指针—>(在ARC中使用,适用于oc对象类型,相当于MRC中的retain)

3、修改setget方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用 在布尔类型中的getter。 

@property(nonatomic,assign, setter=hh:,getter=ll)int age

可以理解为:[p setAge: ]------> [p hh:], [p age] ---------> [p ll]; 

@property(nonatomic,assign,setter=setVip:,getter=isVip)BOOLvip; 

4、oc对象类型(非oc对象类型:直接赋值)

     @property(retain)Car*newcar;

     @property(weak)Car*newcar;

     @property(strong)Car*newcar;

     set方法:-(void)setCar:Car*newcar{

                               if(car!=newcar){       //判断是否有新对象

                               [car release];            //对旧对象release

                             car=[newcar retain];   //对新对象retain

                       } }

5、 @property(copy)Car*newcar;

     set方法:-(void)setCar:Car*newcar{

                                if(car!=newcar){       //判断是否有新对象

                               [car release];            //对旧对象release

                             car=[newcar copy];   //对新对象copy

                       } }

例:

主函数:

#import <Foundation/Foundation.h>
#import "Clothes.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Clothes *clo=[Clothes new];
        Person *per=[Person new];
        [per setClo:clo];  //将clothes给person—>strong
        [per setClo1:clo]; //将clothes给person—>weak
        clo.num=8001;      //点语法赋值即[clo setNum:8001];
        clo.num1=20;       //生成set和get方法
        //clo.num2=30;     //此时会报错,没有生成set方法
        int nu=clo.num2;   //生成get方法
        clo.name=@"以纯";   //assign直接赋值
        clo.name1=@"羽绒服";//弱指针基本类型中直接赋值
        clo.name2=@"秋衣";  //强指针基本类型中直接赋值
        clo.name=@"玛丝菲尔";
        [clo hh:80];     //用修改set方法名称进行赋值
        [clo ll];        //用修改get方法名称获取值
        [clo setVip:YES];     //设置值
        BOOL Vip=clo.isVip;   //获取值
        BOOL Vip1=[clo isVip];//获取值
        NSLog(@"衣服的品牌:%@\t衣服编号为:%d\t衣服的数量:%d\t衣服扣子数:%d",clo.name,clo.num,clo.num1,nu);
        NSLog(@"1号衣服名:%@\t2号衣服名:%@\t衣服数量:%d",clo.name1,clo.name2,[clo ll]);
        NSLog(@"%d\t%d",Vip,Vip1);
  }
    return 0;
}
clothes类声明:

@interface Clothes : NSObject
{
    int _num;
}

@property int num; //会自动生成get、set方法
@property(nonatomic,readwrite)int num1; //生成get和set方法(默认的)
@property(nonatomic,readonly)int num2;  //只生成get方法
@property(nonatomic,assign)NSString*name;  //使用参数assign直接赋值
@property(nonatomic,weak)NSString*name1;   //弱指针基本类型
@property(nonatomic,strong)NSString*name2; //强指针基本类型
@property(nonatomic,copy)NSString*name3;   //copy
@property(nonatomic,assign, setter=hh:,getter=ll)int num3;//修改set和get方法的名称
@property(nonatomic,assign, setter=setVip:,getter=isVip) BOOL vip;//用于BOOL类型
@end
clothes类实现:
#import "Clothes.h"
@implementation Clothes

@end
person类声明:

#import <Foundation/Foundation.h>
#import "Clothes.h"
@interface Person : NSObject
@property(nonatomic,strong)Clothes*clo;//弱指针oc对象类型
@property(nonatomic,weak)Clothes*clo1; //强指针oc对象类型
@end
person类实现:
#import "Person.h"
@implementation Person

@end




  1. ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值