- 不要等到明天,明天太遥远,今天就行动。
须读:看完该文章你能做什么?
对property关键字的修饰符,深刻理解.对于修饰符的<底层原理>有一个深刻了解
学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)
1.property关键字是用来干什么的,
2.synthesize关键字是用来干什么的
3.property在Xcode4.4之后都干了些什么
1.编译器只要看到 @property, 就知道我们要生成某一个属性的 getter/setter方法的声明
2.synthesize 是一个编译器指令,它可以简化 我们getter/setter方法的实现
3.从Xcode4.4以后 Apple 对 @property进行一个增强,以后只要利用一个 @property 就可以同时生成 setter 、 getter 方法的声明 和实现
一、本章笔记
一、setter方法内存管理
1.判断传入的对象 和当前的对象是否一样
2.release 以前对象
3.retain 传入的对象
二、property关键字的修饰符
readonly : 只会生成getter方法
readwrite : 即会生成getter 也会生成 setter, 默认什么都不写 就是readwrite
getter : 可以给生成的getter方法 起一个名称
setter : 可以给setter方法 起一个名称
retain : 就会自动给我们 生成setter/getter方法 内存管理的代码
assign : 不会帮我们生成 setter方法内存管理的代码, 仅仅只会生成 普通 getter/ setter方法, 默认什么不写 就是assign
- (void)setAge:(int)age;
- (int)age;
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
retrun _age;
}
多线程
atomic : 性能低(默认)
nonatomic : 性能高
在iOS开发中 99% 都是些 nonatomic
三、
1.相同类型的property修饰符 不能同时使用
2.不同类型的property修饰符 可以多个结合在一起使用, 多个之间用,隔开
3.iOS开发 只要写上property ,那么就立刻写上 nonatomic
二、code
main.m
#pragma mark 07-property修饰符
#pragma mark 概念
/*
一、setter方法内存管理
1.判断传入的对象 和当前的对象是否一样
2.release 以前对象
3.retain 传入的对象
二、property关键字的修饰符
readonly : 只会生成getter方法
readwrite : 即会生成getter 也会生成 setter, 默认什么都不写 就是readwrite
getter : 可以给生成的getter方法 起一个名称
setter : 可以给setter方法 起一个名称
retain : 就会自动给我们 生成setter/getter方法 内存管理的代码
assign : 不会帮我们生成 setter方法内存管理的代码, 仅仅只会生成 普通 getter/ setter方法, 默认什么不写 就是assign
- (void)setAge:(int)age;
- (int)age;
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
retrun _age;
}
多线程
atomic : 性能低(默认)
nonatomic : 性能高
在iOS开发中 99% 都是些 nonatomic
三、
1.相同类型的property修饰符 不能同时使用
2.不同类型的property修饰符 可以多个结合在一起使用, 多个之间用,隔开
3.iOS开发 只要写上property ,那么就立刻写上 nonatomic
*/
#pragma mark - 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#import "Person.h"
#pragma mark - main函数
int main(int argc, const char * argv[])
{
Person *p = [Person new];
Room *r = [Room new];
Car *c = [Car new];
Dog *d = [Dog new];
p.room = r;
[r release];
/*
p.car = c;
p.dog = d;
[d release];
[c release];
[r release];
[p release];
*/
#pragma mark setter方法内部的内存管理两种情况
// 换房了
// Room *r2 = [Room new];
// p.room = r2;
// [r2 release];
// 重复赋值
p.room = r;
/*
通过 是用retain的修饰符验证
retain 内部是这样做的
- (void)setRoom:(Room *)room
{
if (_room != room) {
[_room release];
_room = [room retain];
}
}
*/
[p release];
return 0;
}
Person
>>>.h
#import <Foundation/Foundation.h>
#import "Room.h"
#import "Car.h"
#import "Dog.h"
@interface Person : NSObject
{
Room *_room;
Car *_car;
Dog *_dog;
}
/*
- (void)setRoom:(Room *)room;
- (void)setCar:(Car *)car;
- (void)setDog:(Dog *)dog;
- (Room *)room;
- (Car *)car;
- (Dog *)dog;
*/
/*
readonly : 只会生成getter方法
readwrite : 即会生成getter 也会生成 setter, 默认什么都不写 就是readwrite
getter : 可以给生成的getter方法 起一个名称
setter : 可以给setter方法 起一个名称
retain : 就会自动给我们 生成setter/getter方法 内存管理的代码
assign : 不会帮我们生成 setter方法内存管理的代码, 仅仅只会生成 普通 getter/ setter方法, 默认什么不写 就是assign
- (void)setAge:(int)age;
- (int)age;
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
retrun _age;
}
多线程
atomic : 性能低(默认)
nonatomic : 性能高
在iOS开发中 99% 都是些 nonatomic
*/
//@property(retain) int age;
#pragma property 修饰符
//@property(retain) Room *room;
// 1.相同类型的property修饰符 不能同时使用
// 2.不同类型的property修饰符 可以多个结合在一起使用, 多个之间用,隔开
// 3.iOS开发 只要写上property ,那么就立刻写上 nonatomic
@property(nonatomic,retain) Room *room;
@end
>>>.m
#import "Person.h"
@implementation Person
/*
setter方法内存管理
1.判断传入的对象 和当前的对象是否一样
2.release 以前对象
3.retain 传入的对象
*/
/*
- (void)setRoom:(Room *)room
{
if (_room != room) {
[_room release];
_room = [room retain];
}
}
- (void)setCar:(Car *)car
{
if (_car != car) {
[_car release];
_car = [_car retain];
}
}
- (void)setDog:(Dog *)dog
{
if (_dog != dog) {
[_dog release];
_dog = [_dog retain];
}
}
- (Room *)room
{
return _room;
}
- (Car *)car
{
return _car;
}
- (Dog *)dog
{
return _dog;
}
*/
- (void)dealloc
{
[_room release];
[_car release];
[_dog release];
NSLog(@"%s",__func__);
[super dealloc];
}
@end
Room
>>>.h
#import <Foundation/Foundation.h>
@interface Room : NSObject
@end
>>>.m
#import "Room.h"
@implementation Room
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end
Car
>>>.h
#import <Foundation/Foundation.h>
@interface Car : NSObject
@end
>>>.m
#import "Car.h"
@implementation Car
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end
Dog
>>>.h
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
>>>.m
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end