alloc new retain之後都必須要調用release方法 計數器要變隻有這幾種方法 retain release alloc new copy方法才會使計數器改變,誰想用人家對象,就對他進行retain操作,但在dealloc釋放本對象的時候也釋放引用的對象,先釋放引用的對象,然後釋放自己,
記憶體管理做到”誰污染誰治理“,誰調用誰retain,是銷毀 也要銷毀retain的對象
當自己手動寫get和set方法的時候,系統就不會幫我們生成synthesize,就不會自動産生下劃線對象,是以在手動寫get和set方法的時候如果用到下劃線字段就會報錯
excu_bad_access就是野指針錯誤,通路了一個不屬于你的記憶體空間
單例中千萬不能寫dealloc方法
assign:相當于str=str+1,是潛拷貝。對基礎資料類型,(NSInteger,CGFloat)和C資料類型(int,float,
double,char,等等)
copy:對NSString
retain:對其他NSObject和其子類
assign:相當于str=str+1,是淺拷貝。對基礎資料類型,(NSInteger,CGFloat)和C資料類型(int,float,
double,char,等等)
NSMutableString *str1 = [NSMutableString stringWithString:@"mmmmmm"];
NSString *str2 = [str1 copy]; //拷貝一份出來,如果不用copy的話,後面對str1進行修改,那麼也會影響str2的指派
[str1 appendString:@"asdf"];
[str1 release];
NSLog(@"%@",str2);
用點文法,引用計數器就加1
-(id)initWithCoder:(NSCoder *)aDecoder{
if(self = [super init]){
self.name = [aDecoder decodeObjectForKey:@"name"]; //用了.文法,它的引用計數器就會+1
self.email = [aDecoder decodeObjectForKey:@"email"];
}
return self;
retain:
-(void)setName:(NSString *)name{
if(_name != book){ //判斷傳進來的對象是否等于目前對象,如果不等,則釋放之前的對象,再retain新對象
[_name release]; //會自動釋放目前的對象, 防止原先stu.book = book0;接着stu.book = book1;那麼book0就會有記憶體洩露,沒有被釋放,這個的話很好的防止了這一點,這也就是retain的作用
_name = [name retain];
}
[stu release];
[stu release]; //野指針(會報錯) 野指針指指向的内容不屬于你的
stu = nil;//指将指針所指向的那條線給擦掉
[nil release]; //空指針(不報錯) 空指針指指向的線斷了,等于不指向什麼記憶體空間
@class Student 在子類中申明Student是一個類,就不需要寫@import "Student.h",因為那樣會降低性能,import相當于把所有的頭檔案都拷貝過去了,在.m檔案中寫@import "Student.h",因為.m檔案中真正要使用Student的那些方法。
@class有些功能 @import是做不到的 當兩個類互相包含的時候,互相@import的時候就會出錯,但@class互相包含就不會報錯,隻是什麼這是一個類,如果有上百個類都要引用Student這個類,那麼用@import的話,隻要Student類中有一點點改變,這些都要重新
編譯,是以還是用@class比較好
标準的set方法(也就是retain的内部實作機制)
-(void)setBook:(Book*)book{
if(_book != book){
[_book release];
_book = [book retain];
标準的dealloc方法
-(void)dealloc{
[super dealloc];
标準的初始化方法
- (id)initWithAge:(int)age {
if ( self = [super init] ) {
_age = age;
}
return self;
然後建立對象:
Student *stu = [Student alloc] initWithAge:22];
stu.name = @"dingxiaowei";
NSLog(@"%@",stu);
@class有些功能 @import是做不到的 當兩個類互相包含的時候,互相@import的時候就會出錯,但@class互相包含就不會報錯,隻是什麼這是一個類,如果有上百個類都要引用Student這個類,那麼用@import的話,隻要Student類中有一點點改變,這些都要重新編譯,是以還是用@class比較好
category能夠動态給某個類動态的拓展方法,但不能添加屬性
用category建立的分類,@interface Student(Test),類名後面如果有括号代表分類名稱,如果後面有冒号,則代表繼承,分類也要import導入要拓展的.h檔案,但不能用@class,因為要對那個累拓展方法,是以要@import複制出有哪些方法,才能防止申明重複的同名方法
alloc new copy 是深拷貝,retain是淺拷貝
autorelease不是立即釋放,是等到程式結束的時候将每個對象釋放一次
本文轉自蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366497,如需轉載請自行聯系原作者