標籤:
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) {// @autoreleasepool {// // Person *p = [[Person alloc] initWithName:@"池" gender:@"nan" age:18];// NSLog(@"%lu",[p retainCount]);// // // NSLog(@"--------------");// Person *p1 = [p retain];// NSLog(@"%lu",[p retainCount]);// NSLog(@"%lu",[p1 retainCount]);// // NSLog(@"--------------");// // Person *p2 = [p1 retain];// NSLog(@"%lu",[p retainCount]);// NSLog(@"%lu",[p1 retainCount]);// NSLog(@"%lu",[p2 retainCount]);// // NSLog(@"--------------");// //release 讓對象的引用計數立即 -1// [p release];// NSLog(@"%lu", [p retainCount]);// [p release];// NSLog(@"%lu", [p retainCount]);// [p release];// NSLog(@"%lu", [p retainCount]);// 錯誤的// //誰才有引用計數的概念:// //1.堆區空間才有引用計數的概念// //2.堆區的對象才會有引用計數// // }// Person *p = [[Person alloc] initWithName:@"張三" gender:@"男" age:18];// NSLog(@"%lu", [p retainCount]);// [p retain];// NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];// // // // [p autorelease];// // NSLog(@"%lu",[p retainCount]);// // // // [pool release];// NSLog(@"%lu",[p retainCount]);// //企業級題// @autoreleasepool {// for (long i = 0; i < 100000000; i++) {// @autoreleasepool {// Person *per = [[Person alloc] init];// [per autorelease];// }// }// } //記憶體管理原則:當你對一個對象進行了 alloc, retain, copy 操作,你就對該對象擁有了所有權,要對該對象負責,對其進行release,或者autorelease操作 //在一個方法內部,要保證對象的+ 和 - 相等. //建立Person對象 @autoreleasepool { Person *p = [Person personWithName:@"張三" gender:@"男" age:44]; Person *p1 = [p copy]; [p1 sayHi]; [p1 release]; } //記憶體問題: //1.野指標錯誤:最後一個release玩,空間已經被系統回收,如果再訪問,就是訪問一塊沒有所有權的空間,出現野指標,野指標不會立即報錯,但是存在安全隱患,另外,錯誤不容易排錯. //2.過度釋放:對一塊沒有所有權的空間進行釋放空間,會造成程式的立即crash; //3.記憶體泄露:對一塊擁有所有權的空間,使用完之後沒有釋放,此時存在安全隱患,當記憶體泄露足夠多得時候,造成程式的crash; return 0;}
person.h
#import <Foundation/Foundation.h>@interface Person : NSObject<NSCopying>@property (nonatomic,retain) NSString *name;@property (nonatomic,retain) NSString *gender;@property (nonatomic,assign) NSInteger age;- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;+ (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;- (void)sayHi;@end
person.m
#import "Person.h"@implementation Person- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{ if (self = [super init]) { self.name = name; self.gender = gender; self.age = age; } return self;}+ (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{ return [[[self alloc] initWithName:name gender:gender age:age] autorelease]; }- (void)sayHi{ NSLog(@"sayHigoggo");}//當對一個兌現copy時,會自動調用該方法,用來建立新的對象,複製內容- (id)copyWithZone:(NSZone *)zone{ //1.建立新的對象 Person *newPer = [[Person allocWithZone:zone] init]; //2.拷貝內容 newPer.name = self.name; newPer.age = self.age; newPer.gender = self.gender; //3.返回新的對象 return newPer;}//當對象的引用計數為0是系統會自動調用,切記不要人為調用- (void)dealloc{ NSLog(@"%@回收了",self); [super dealloc];}@end
iOS中的記憶體管理1