pragma mark property修饰符
pragma mark 概念
/**
readonly : 只会生成getter方法
readwrite : 既会生成getter 也会生成 setter , 默认什么都不写 就是readwrite (可读可写)
getter : 可以给生成的getter方法起一个名称
setter : 可以给生成的setter方法起一个名称
// 默认什么都不写 就是 assgin
retain : 就会自动帮我们生成 getter / setter 方法内存管理的代码
assign : 不会帮我们生成set方法内存管理的代码, 仅仅只会生成普通的 getter / setter 方法
多线程
atomic : 性能低(默认) (相当于单线程) 做PC开发
nonatomic : 性能高 (相当于多线程)
在iOS开发中 99.99%都是写nonatomic
项目使用
// 1. 相同的类型的property修饰符 不能同时使用 (setter 和 getter方法除外)
// 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;
// p.car = c;
// p.dog = d;
//
// [d release];
// [c release];
// [r release];
// [p release];
*/
p.room = r;
[r release];
#warning 此时 这里的房间对象 有3个, 如果set方法中没有release旧值 就会内存泄漏 因为Room *r 中的这个对象没有释放掉
// // 换房了, 如果set方法中没有release旧值, 就会内存泄漏
// Room *r2 = [Room new];
// [r2 release];
// 重复赋值 (如果retain 没有做操作 也就是旧值release 新值retain 那么就会出现野指针错误)
p.room = r;
/*
有retain 的 setter方法
- (void)setRoom:(Room *)room
{
if (_room != room) {
[_room release];
_room = [room retain];
}
}
没有retain 的 setter方法
- (void)setRoom:(Room *)room
{
_room = room
}
}
*/
[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;
}
#pragma mark setter getter 方法
/*
- (void)setRoom:(Room *)room;
- (void)setCar:(Car *)car;
- (void)setDog:(Dog *)dog;
- (Room *)room;
- (Car *)car;
- (Dog *)dog;
*/
#pragma mark 以后设置
// 1. 相同的类型的property修饰符 不能同时使用
// 2. 不同类型property 修饰可以多个结合在一起使用, 多个之间用 , 号 隔开
// 3. iOS 开发 只要写上property, 那么就立刻写上nonatomic
//@property (retain)Room *room;
//@property (readonly,readwrite)Room *room;
//@property (getter=abc,setter=def:)Room *room; // 设置setter 和 getter 方法 可以同时使用
@property (nonatomic, retain, getter=abcGet,setter=abcSet:) Room *room;
#pragma mark setter getter 方法的声明和实现 (包含有retain和 没有retain参数)
/*
- (void)setAge:(int)age;
- (int)age;
#warning 默认assgin
- (void)setAge:(int)age
{
_age = age;
}
#warning 设置retain
- (void)setAge:(int)age
{
[_age release];
// if(_age != age)
// {
// // nil != 0ffc8
// [_age release];
//
// // 应该对 房间类 的引用计数器+1
// [age retain];
//
// _age = age;
}
- (int)age
{
return _age;
}
readonly : 只会生成getter方法
readwrite : 既会生成getter 也会生成 setter , 默认什么都不写 就是readwrite (可读可写)
getter : 可以给生成的getter方法起一个名称
setter : 可以给生成的setter方法起一个名称
// 默认什么都不写 就是 assgin
retain : 就会自动帮我们生成 getter / setter 方法内存管理的代码
assign : 不会帮我们生成set方法内存管理的代码, 仅仅只会生成普通的 getter / setter 方法
*/
#pragma mark retain 做的操作
// - (void)setRoom:(Room *)room // room = r
// {
// #warning ⚠️(重点) 每次换房的时候 将以前的房间 释放掉 -1
// // [_room release];
// #warning 👍(重点修改) 每次换房的时候 《只有房间不同才需要》 将以前的房间 释放掉 -1
// // 如果当前的房间 不等于 传递进来的房间 才需要做操作
// // 只有房间不同 才需要 release 和 retain
// if(_room != room)
// {
// // nil != 0ffc8
// [_room release];
//
// /*
// // 应该对 房间类 的引用计数器+1
// [room retain];
//
// _room = room;
// */
//#warning 优化
//// retain 不仅仅会对引用计数器+1,而且还会返回当前对象
//_room = [room retain];
//}
//}
@end
Person.m
#import "Person.h"
@implementation Person
#warning 基本数据类型 是存储在 栈 中 不需要管理内存
#warning 对象是存储在 堆 中 需要管理内存
#pragma mark setter getter 方法
/*
- (void)setRoom:(Room *)room
{
// 1. 判断传入的对象 和 当前对象是否一样
if (_room != room) {
// 2. release 以前的对象
[_room release];
// 3. retain 传入的对象
_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
Room.m
``#import "Room.h"
@implementation Room
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end`
---
#####Person.h //人类
```objc
Car.h //车类
#import <Foundation/Foundation.h>
@interface Car : NSObject
@end
Car.m
#import "Car.h"
@implementation Car
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end
Dog.h //狗类
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
Dog.m
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end