日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内存管理高级知识点

發(fā)布時間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存管理高级知识点 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • 屬性的內(nèi)部實現(xiàn)原理

  • dealloc內(nèi)釋放實例變量

  • 便利構(gòu)造器方法的實現(xiàn)原理

  • collection的內(nèi)存管理

  • 屬性的語義特性及使用范圍。assign ?retain ?copy

    assign下的屬性內(nèi)部實現(xiàn)

    setter方法getter方法
    @property(nonatomic , assign)NSString *name;
    - (void)setName:(NSString *)name
    {
    ? ? ? ?_name = name;
    }
    - (NSString *)name ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
    { ??
    ? ? ?return _name;
    }

    main.m中.

    NSString *name = [[NSString alloc] intwithFormat:@“張三]”;

    Person *p = [[Person alloc] init];

    [p setName:name];

    [name release];

    NSLog(@“%@“, [p name]); ? ?<——————這里因為上面[name release];了,造成野指針異常 ??

    [p release] ? ? ?

    retain下的屬性內(nèi)部實現(xiàn)

    setter方法getter方法
    @property(nonatomic , assign)NSString *name;
    - (void)setName:(NSString *)name
    {
    ? ? ? ?if(_name != name){
    ? ? ? ? ? ? [_name release];
    ? ? ? ? ? ? ?_name = [name retain];
    ? ? ? ? ? ?}
    }
    - (NSString *)name ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
    { ??
    ? ? ?return [[_name retain] autorelease];
    }

    main.m中.

    NSString *name = [[NSString alloc] intwithFormat:@“張三]”;

    Person *p = [[Person alloc] init];

    [p setName:name];

    [name release];

    NSLog(@“%@“, [p name]); ? ? ??

    NSString *newName = [[NSString alloc] initWithFormat:@“李四”];

    [p setName:newName];

    [newName release];

    NSLog(@“%@“, [p name]); ? ??

    [p release] ? ? ??

    copy下的屬性內(nèi)部實現(xiàn)

    setter方法getter方法
    @property(nonatomic , assign)NSString *name;
    - (void)setName:(NSString *)name
    {
    ? ? ? ?if(_name != name){
    ? ? ? ? ? ? [_name release];
    ? ? ? ? ? ? ?_name = [name copy];
    ? ? ? ? ? ?}
    }
    - (NSString *)name ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
    { ??
    ? ? ?return [[_name retain] autorelease];
    }

    main.m中.

    NSString *name = [[NSString alloc] intwithFormat:@“張三]”;

    Person *p = [[Person alloc] init];

    [p setName:name];

    [name release];

    NSLog(@“%@“, [p name]); ? ? ??

    NSString *newName = [[NSString alloc] initWithFormat:@“李四”];

    [p setName:newName];

    [newName release];

    NSLog(@“%@“, [p name]); ? ??

    [p release] ? ? ?

    //疑問?始終有一塊內(nèi)存沒有釋放掉。。。。。。。


    dealloc

    • dealloc是NSObject的一個實例方法,與alloc對應用與回收開辟的內(nèi)存空間

    • 這個方法在對象引用計數(shù)為0時,由系統(tǒng)自動調(diào)用

    • 通常我們在dealloc中釋放類的實例變量

    Person.m中

    - (void)dealloc{

    ? ? ? ?[_name release]; ?//釋放setter方法泄漏的內(nèi)存,,,完美解決類上面的疑問。。

    ? ? ? ?[super dealloc];

    }


    dealloc的注意事項

    • 永遠不要手動調(diào)用dealloc

    • 在dealloc方法的最后一行,必須要寫[super dealloc];

    構(gòu)造便利器的內(nèi)存管理

    ------->在便利構(gòu)造器的時候只有alloc開辟空間,可是沒有釋放,怎么辦呢 ??


    Person.m中

    + (instancetype)personWithName:(NSString *)name{

    ? ? ? ? ? Person *p = [[Person alloc] initWithName:name];

    ? ? ? ? ? return [p autorelease];

    }

    或者

    + (instancetype)personWithName:(NSString *)name{

    ? ? ? ? ? return [[Person alloc] initWithName:name]?autorelease];

    }


    collection

    • collection就是NSArray, NSDictionary, NSSet,,,,等容器類

    • collection會自主管理自己內(nèi)部元素

    加入collection中的對象會被retain

    移除出collection的對象會被release?

    collection被釋放會對內(nèi)部所有對象release?




    轉(zhuǎn)載于:https://blog.51cto.com/liuyafang/1545350

    總結(jié)

    以上是生活随笔為你收集整理的内存管理高级知识点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。