OC語(yǔ)言day05-07property修飾符

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容