天天看點

OC學習筆記[注意事項]

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,如需轉載請自行聯系原作者

繼續閱讀