OC學習總結(二)

cyxlzzs發表於2015-02-15

oc學習總結(二)

7、記憶體管理

》以下兩種情況發生時,所有者物件將會獲得該物件的所有權
    建立或者複製物件:alloc, allocWithZone:, copy, copyWithZone:, mutableCopy, mutableCopyWithZone:
    保留物件:retain
》在不需要時所有者物件必須釋放對該物件的所有權
    release, autorelease
》release的一些場景
    1、alloc後不用時
    2、陣列的addObject後
    3、物件持有其他物件所有權時的dealloc方法中

8、點語法

》賦值
    assign:直接賦值(相當於一個別名),default。
    retain:保留物件,兩個物件指向同一記憶體區域
    copy:拷貝物件,開闢新空間。指向不同記憶體空間。有時相當於retain。必須實現NSCopying協議
》讀寫性
    readwrite:生成getter和setter,default
    readonly:只有getter
》原子性(多執行緒環境下)
    nonatomic:不鎖定,
    atomic:鎖定,執行緒保護,default

9、檔案管理

》NSFileManager
    檔案(目錄)的建立,刪除等操作,構造方法[NSFileManager defaultManager]
》NSFileHandle
    檔案內容的建立,修改等操作,可以建立分別用於讀、寫和修改的handle物件

10、NSTimer定時器

》常用方法
 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti
 target:(id)aTarget selector:(SEL)aSelector
  userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
ti:間隔時間,秒數
target:selector所屬物件
selector:間隔執行方法,一般包含一個NSTimer引數timer,可以將當前建立的NSTimer傳遞給該方法
userInfo:一般用於傳遞引數給selector,取出timer.userInfo
repeats:是否重複執行

》在控制檯程式中,為避免main函式過早return後,定時器無法起作用,
這時必須使用[[NSRunLoop currentLoop] run]來使程式一直執行起

11、物件的深淺拷貝

》拷貝必須實現拷貝協議NSCopying和NSMutableCopying,實現copyWithZone方法

》copy和mutableCopy都是NSObject中的方法,呼叫時會呼叫NSCopying協議中得copyWithZone方法

》Foundation框架中,當copy的是一個不可變物件時,相當於retain(cocoa做得記憶體優化)
mutableCopy或者是可以變物件的copy都是拷貝一個新物件

》淺拷貝:只拷貝物件本身,不拷貝物件的屬性;深拷貝:拷貝物件包含的屬性;Foundation中支援拷貝的物件
都只是淺拷貝,包括NSNumber,NSArray,NSString,NSDictionary,NSMutableArray,
NSMutableDictionary,NSMutableString

12、物件的歸檔

》歸檔NSKeyedArchiver,可以指定key來序列化多個物件在同一個檔案中

》解歸檔NSKeyedUnarchiver

》物件必須實現NSCoding協議才能進行歸檔和解歸檔
    - (void)encodeWithCoder:(NSCoder *)aCoder; 歸檔
    - (id)initWithCoder:(NSCoder *)aDecoder;   解歸檔

13、 單例模式

》應用場景
    1、儲存全域性資料
    2、重量級物件:初始化耗費資源的物件,提高效率

》單例物件的建立
    1、定義一個靜態全域性值為nil的物件 static AppManager *manager = nil;
    2、定義一個類方法建立物件 + (id)shareManager;
        + (id)shareManager{
            //此處必須加執行緒保護,防止多執行緒環境中建立出多個例項
            @synchronized(self){
                if(manager==nil){
                    manager = [[AppManager alloc] init];
                }
            }

            return manager;
        }
    3、覆蓋+ (id)allocWithZone:(NSZone *)zone;方法,防止直接呼叫alloc方法建立出新的物件
    4、覆蓋- (id)copyWithZone:(NSZone *)zone;方法,防止呼叫copy(返回靜態例項)方法建立出新物件
    5、覆蓋release(不做任何操作),autorelease(返回靜態例項)方法,防止物件的銷燬
    6、覆蓋retain方法,返回靜態例項
    7、覆蓋retainCount方法,直接放回UINT_MAX
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版權宣告:本文為博主原創文章,未經博主允許不得轉載。