您好,登錄后才能下訂單哦!
創建Person類,添加兩個屬性,實例方法,便利構造器,和一個無返回值方法
main.m中
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSString *name = [[NSString alloc] initWithFormat:@"劉亞方"]; //name開辟空間 Person *p = [[Person alloc] init]; //類開辟空間 [p setName:name]; //p-->name (.m中 ,,_name = name;|) [name release]; // 釋放name ...那么p就變成了野指針,,,解決方法[name retain] NSString *newName = [[NSString alloc] initWithFormat:@"六小二"];//重新定義空間newName [p setName:newName]; // p-->newName內存泄漏。。。。原來的name沒有指向了,解決方法 [_name release]; [p sayHi]; //如果是在常量區,兩個地址一樣的時候。那么就要加個判斷,如果一樣就直接使用if (_name != name){},如果不一樣就清空,然后retain。。。 [p release]; //疑問?始終有一塊內存沒有釋放掉。。。。。。。 //野指針(指針指向空內存) - [retain] --- //重新定義-- 內存泄漏(原來的name沒有指針指向)。解決方法 [_name release]; 原來的_name = nil 那么[_name release]; 相當于什么都沒有做 //這里是在常量區,兩個地址一樣的時候。那么就要加個判斷,如果一樣就直接使用if (_name != name){} } return 0; }
Person. h中
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic , copy)NSString *name; @property (nonatomic , assign)NSInteger age; - (instancetype)initWithName:(NSString *)name age:(NSInteger)age; + (instancetype)personWithName:(NSString *)name age:(NSInteger)age; - (void)sayHi; @end
Person.m中
#import "Person.h"
@implementation Person @synthesize name = _name; @synthesize age = _age; - (void)dealloc { [_name release]; [super dealloc]; } //- (void)setName:(NSString *)name //{ // [_name release]; // _name = [name retain]; //} - (void)setName:(NSString *)name { if (_name != name) { //這里是在常量區,兩個地址一樣的時候。那么就要加個判斷,如果一樣就直接使用 [_name release]; _name = [name copy]; } } - (instancetype)initWithName:(NSString *)name age:(NSInteger)age { self = [super init]; if (self) { self.name = name; self.age = age; } return self; } + (instancetype)personWithName:(NSString *)name age:(NSInteger)age { Person *p = [[Person alloc] initWithName:name age:age]; return [p autorelease]; //用完后,遇到autoreleasepool池自動釋放; // return [[[Person alloc] initWithName:name age:age] autorelease]; //也可以這樣簡寫 } - (void)sayHi { NSLog(@"name :%@",_name); } @end
任何一個對象都有一個或多個擁有者,只要有一個對象指向他就一直存在, 如果對象沒有擁有者,那么這個運行時系統自動銷毀,為了保證清楚你的內存,定下以下法則:
你擁有任何你創建的對象---
你使用來retain就可以獲得這個對象的所有權 -valid
當你不再使用你創建的對象的時候,你必然把所有權歸還回去。。(release)(autorelease)兩種方式 “releasing” an object.
你不能釋放你沒有擁有的對象 //You must not relinquish ownership of an object you do not own
1.內存管理的黃金法則:The basic rule to apple is everything thatincreases the reference counter with alloc,[mutable]copy[WithZone:] or retain is in charge of the corresponding [auto]release. 即:如果一個對象使用了alloc,[mutable] copy,retain,那么你必須使用相應的release或autonrelease.
2.規則:
1、Objective-C類中實現了引用計數器,對象知道自己當前被引用的次數
2、最初對象的計數器為1
3、如果需要引用對象,可以給對象發送一個retain消息,這樣對象的計數器就加1
4、當不需要引用對象了,可以給對象發送release消息,這樣對象計數器就減1
5、當計數器減到0,自動調用對象的dealloc函數,對象就會釋放內存
6、計數器為0的對象不能再使用release和其他方法
3.內存問題主要有:內存溢出 內存過渡釋放 野指針 三種
內存溢出(內存堆積):大量的開辟空間但并不立即釋放,通常是由于使用autorelease產生的.
內存過渡釋放:對象將內存已經還給系統,之后再次歸還給系統這時就會出現內存過渡釋放的問題.
野指針:對象指向的內存空間已經歸還給系統但此時再次調用了指向該指針空間的指針,就會產生野指針的問題.
4.內存管理的形式:MRC (manual reference count) 人工引用計數機制 內存的開辟和釋放都有手動代碼進行控制.ARC(auto reference count )自動引用計數機制 不需要人工控制系統自動進行管理.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。