黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法

<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流!

一般来说在一个类中 成员变量是会有setter 跟getter方法的。

如果每一个成员变量的setter 跟getter方法都要手写出来的话 很麻烦 很耗时

而且 大部分setter 跟getter方法内容都是简单的赋值 跟return

所以 有些成员变量 没必要手写setter 跟getter方法

@property int age;

这句话代表着 声明setAge:(int)age; 方法与 (int)age方法

@synthesize age = _age;

这句话代表着 实现以上的2个方法 并且访问成员变量_age

如果_age不存在 就会自动生成private成员变量_age

但是在现在的版本中  @property  已经可以 既声明又实现 所以 synthesize 已经用不到了

当然  这只是@property 最初级的用法

1、有时候我们不想声明set方法 可以通过@property来控制

@property (readonly) int age; //这是代表着 只读  也就是只有getter方法 没有setter方法

@property (readwrite) int age;//这种形式代表着  getter、setter方法都有

2、当我们使用oc对象时  需要手动控制内存计数器

比如 对一个oc对象 调用set方法

(void) setBook : (Book *) book

{

if(book!=_book)  //需要判断 是否与已有的book相同 若不相同的话则覆盖以前的book对象

{

[ _book release]; // 先对前任book 的计数器减一

_book = book; //覆盖 _book指向的内存地址

[ _book retain];// 对_book现在指向的对象 计数器+1

}

}

这样写 才不会出现内存泄露的问题

但是这些代码完全可以用一句话来代替

@property (retain) Book *book; // 这句话生成上面的方法 适用于oc对象

@property(assign) int age;  //这是默认的形式 适用于非oc对象

3、有关多线程管理的问题

oc中 并没有把多线程的问题显露出来 而是对其进行了进一步封装

@property(nonatomic) int age; //代表这高性能

@property(atomic) int age; //这是默认的形式 性能低  在oc项目中一般使用高性能的

4、 setter getter方法的名称生成

@property int age;  //这句话生成的名称是系统默认的 setAge: 与 age

但是我们如果不想用 默认名称的话 可以自己设置

@property(getter = abc,setter = setAbc:) int age;

这句话生成的get方法就是 abc

[p setAbc:100];

[p abc];

以上的这些关键词 都可以混着用

@property (readonly, assign) int age;

@property (nonatomic, retain) int age;

在第二条内存管理中 还涉及到一种 循环引用的问题

有两个类 Person 与Card

在Person类中 使用了 Card对象  property(nonatomic,retain) Card* card;

在Card类中使用了Person对象   property(nonatomic,retain) Person *p;

p与card都是oc对象 所以按照上面的规则  应该 使用retain关键词

但是这样的话 就会导致在使用的时候 p与card无法释放

所以 就不能这样写

解决方法是: 一端用retain 一端用assign

把property(nonatomic,retain) Person *p;

改成property(nonatomic,assign) Person *p;即可

<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流!

黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法

时间: 2024-11-09 17:46:54

黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法的相关文章

黑马程序员_OC学习笔记之@property和@synthesize

[objc] view plaincopyprint? <span style="font-size:24px;">#import <Foundation/Foundation.h> @interface Person : NSObject { int _age; int age; int _height; int height; int _weight; int weight; int _money; int money; } @property int ag

黑马程序员_ JAVA中的多线程

尽管线程对象的常用方法可以通过API文档来了解,但是有很多方法仅仅从API说明是无法详细了解的. 本来打算用一节的篇幅来把线程方法中一些重要的知识说完,但这样下来估计要很常的篇幅,可能要用好几节才能说把和线程方法相关的一些重要的知识说完. 首先我们接基础篇(二)来说明start()方法. 一个线程对象生成后,如果要产生一个执行的线程,就一定要调用它的start()方法.在介绍这个方法时不得不同时说明run方法.其实线程对 象的run方法完全是一个接口回调方法,它是你这个线程对象要完成的具体逻辑.

黑马程序员———基础视频中涉及的几个设计模式

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- package o_oriented; /* 设计模式: 解决某一问题最行之有效的方法.java中有23种设计模式. 单例设计模式: 解决一个类在内存只存在一个对象. 思路: 1.为了避免其他程序过多的建立该类对象,先禁止其他程序访问该类

黑马程序员- oc中点语法和@property的使用

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 点语法 其实就是set方法和get方法 #import<Foundation/Foundation.h> @interface Person : NSObject { int _age; } - (void)setAge:(int)age; - (int)age; @end @implementation Person - (void)setAge:(int)age { _age = age

黑马程序员——IO包中的其他类

IO包中的其他类: 1.打印流:提供了打印方法,可以将各种数据类型的数据原样打印     字节打印流PrintStream       构造函数可以接受的参数类型:         (1)File对象  File          (2)字符串路径 String          (3)字节输出流  OutputStream 字符打印流PrintWriter        构造函数可以接受的参数类型:           (1)File对象  File          (2)字符串路径 Str

黑马程序员----内存管理之三——《@property的内存管理》

内存管理之三——<@property的内存管理> 1.@property中与setter内存管理相关的参数 retain : release旧值,retain新值(适用于OC对象类型): assign : 直接赋值,(默认,适用于非OC对象类型): copy  : release旧值,copy新值: 2.@property中是否生成setter的参数 readonly  : 只会生成getter的声明和实现: readwrite : 同时生成setter和getter的声明和实现: 3.@pr

黑马程序员【java中的反射机制】

Java中的反射机制 ------- android培训.java培训.期待与您交流! ---------- java的反射机制是java的特性之一,反射机制是构建框架技术的基础所在,使用反射可以使程序更加灵活,避免将程序写死在代码里.相对于很多初学者只接触过java基础的人,反射还是一个很朦胧难懂的概念,下面我们就来说一下反射的一些应用. java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能.java反射有3个动态性质:1.运行时生成对象实例,2.运行期间调用发放,3.运行

黑马程序员——OC学习小结------成员变量以及对应的set、get方法

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.总结 1.只有利用类名调用类方法的时候,不需要在类名后面写*.其他情况下,类名后面统一加上一个* Circle *c1 = [Circle new]; - (BOOL)isInteractWithOther:(Circle *)other; 2.返回值是BOOL类型的方法,方法名一般都以is开头 - (BOOL)isInteractWithOther:(Circle *)other; 3.

@property和@synthesize快速生成getter setter方法

//@property: 可以自动生成某个成员变量的setter和getter声明,用于类的.h文件中 @property int age; 相当于 - (void)setAge:(int)age; - (int)age; 同一类型的数据写法 @property int age,age1; //@synthesize:自动生成age的setter和getter的实现 @synthesize age = _age 相当于 - (void)setAge:(int)age { _age = age;