pragma mark property修飾符
pragma mark 概念
/**
readonly : 只會(huì)生成getter方法
readwrite : 既會(huì)生成getter 也會(huì)生成 setter , 默認(rèn)什么都不寫(xiě) 就是readwrite (可讀可寫(xiě))
getter : 可以給生成的getter方法起一個(gè)名稱
setter : 可以給生成的setter方法起一個(gè)名稱
// 默認(rèn)什么都不寫(xiě) 就是 assgin
retain : 就會(huì)自動(dòng)幫我們生成 getter / setter 方法內(nèi)存管理的代碼
assign : 不會(huì)幫我們生成set方法內(nèi)存管理的代碼, 僅僅只會(huì)生成普通的 getter / setter 方法
多線程
atomic : 性能低(默認(rèn)) (相當(dāng)于單線程) 做PC開(kāi)發(fā)
nonatomic : 性能高 (相當(dāng)于多線程)
在iOS開(kāi)發(fā)中 99.99%都是寫(xiě)nonatomic
項(xiàng)目使用
// 1. 相同的類型的property修飾符 不能同時(shí)使用 (setter 和 getter方法除外)
// 2. 不同類型property 修飾可以多個(gè)結(jié)合在一起使用, 多個(gè)之間用 , 號(hào) 隔開(kāi)
// 3. iOS 開(kāi)發(fā) 只要寫(xiě)上property, 那么就立刻寫(xiě)上nonatomic
*/
pragma mark 代碼
#import <Foundation/Foundation.h>
#pragma mark 類
#import "Person.h"
#pragma mark main函數(shù)
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 此時(shí) 這里的房間對(duì)象 有3個(gè), 如果set方法中沒(méi)有release舊值 就會(huì)內(nèi)存泄漏 因?yàn)镽oom *r 中的這個(gè)對(duì)象沒(méi)有釋放掉
// // 換房了, 如果set方法中沒(méi)有release舊值, 就會(huì)內(nèi)存泄漏
// Room *r2 = [Room new];
// [r2 release];
// 重復(fù)賦值 (如果retain 沒(méi)有做操作 也就是舊值release 新值retain 那么就會(huì)出現(xiàn)野指針錯(cuò)誤)
p.room = r;
/*
有retain 的 setter方法
- (void)setRoom:(Room *)room
{
if (_room != room) {
[_room release];
_room = [room retain];
}
}
沒(méi)有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 以后設(shè)置
// 1. 相同的類型的property修飾符 不能同時(shí)使用
// 2. 不同類型property 修飾可以多個(gè)結(jié)合在一起使用, 多個(gè)之間用 , 號(hào) 隔開(kāi)
// 3. iOS 開(kāi)發(fā) 只要寫(xiě)上property, 那么就立刻寫(xiě)上nonatomic
//@property (retain)Room *room;
//@property (readonly,readwrite)Room *room;
//@property (getter=abc,setter=def:)Room *room; // 設(shè)置setter 和 getter 方法 可以同時(shí)使用
@property (nonatomic, retain, getter=abcGet,setter=abcSet:) Room *room;
#pragma mark setter getter 方法的聲明和實(shí)現(xiàn) (包含有retain和 沒(méi)有retain參數(shù))
/*
- (void)setAge:(int)age;
- (int)age;
#warning 默認(rèn)assgin
- (void)setAge:(int)age
{
_age = age;
}
#warning 設(shè)置retain
- (void)setAge:(int)age
{
[_age release];
// if(_age != age)
// {
// // nil != 0ffc8
// [_age release];
//
// // 應(yīng)該對(duì) 房間類 的引用計(jì)數(shù)器+1
// [age retain];
//
// _age = age;
}
- (int)age
{
return _age;
}
readonly : 只會(huì)生成getter方法
readwrite : 既會(huì)生成getter 也會(huì)生成 setter , 默認(rèn)什么都不寫(xiě) 就是readwrite (可讀可寫(xiě))
getter : 可以給生成的getter方法起一個(gè)名稱
setter : 可以給生成的setter方法起一個(gè)名稱
// 默認(rèn)什么都不寫(xiě) 就是 assgin
retain : 就會(huì)自動(dòng)幫我們生成 getter / setter 方法內(nèi)存管理的代碼
assign : 不會(huì)幫我們生成set方法內(nèi)存管理的代碼, 僅僅只會(huì)生成普通的 getter / setter 方法
*/
#pragma mark retain 做的操作
// - (void)setRoom:(Room *)room // room = r
// {
// #warning ??(重點(diǎn)) 每次換房的時(shí)候 將以前的房間 釋放掉 -1
// // [_room release];
// #warning ??(重點(diǎn)修改) 每次換房的時(shí)候 《只有房間不同才需要》 將以前的房間 釋放掉 -1
// // 如果當(dāng)前的房間 不等于 傳遞進(jìn)來(lái)的房間 才需要做操作
// // 只有房間不同 才需要 release 和 retain
// if(_room != room)
// {
// // nil != 0ffc8
// [_room release];
//
// /*
// // 應(yīng)該對(duì) 房間類 的引用計(jì)數(shù)器+1
// [room retain];
//
// _room = room;
// */
//#warning 優(yōu)化
//// retain 不僅僅會(huì)對(duì)引用計(jì)數(shù)器+1,而且還會(huì)返回當(dāng)前對(duì)象
//_room = [room retain];
//}
//}
@end
Person.m
#import "Person.h"
@implementation Person
#warning 基本數(shù)據(jù)類型 是存儲(chǔ)在 棧 中 不需要管理內(nèi)存
#warning 對(duì)象是存儲(chǔ)在 堆 中 需要管理內(nèi)存
#pragma mark setter getter 方法
/*
- (void)setRoom:(Room *)room
{
// 1. 判斷傳入的對(duì)象 和 當(dāng)前對(duì)象是否一樣
if (_room != room) {
// 2. release 以前的對(duì)象
[_room release];
// 3. retain 傳入的對(duì)象
_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 //門(mén)類
#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