【iOS 開發基礎學習 六】

類目

  • 定義:類目可以爲一個現有的類擴展新的方法,擴展的方法會成爲原始類的一部分且可以被子類繼承
  • 創建FileType爲Category的文件
  • 注意事項:
1、類目只能增加方法不能增加屬性
2、可以重寫原始類的方法(無法調用原始類的被重寫的方法)
  • 例:

#import "NSArray+Log.h"

@implementation NSArray (Log)

/*
 (
    @"jack",@"tom"
 )
 */
- (NSString *)description {
   //@"(jack,tom,)"
    NSMutableString *desc = [NSMutableString stringWithString:@"(\n"];
    for (int i=0;i<self.count;i++) {
       	NSString *s = self[i];
        [desc appendFormat:@"   %@",s];
        if (i != self.count-1) {
            [desc appendString:@",\n"];
        }
     }
    [desc appendString:@"\n)"];
   	return desc;
}
@end

延展(類目中的一個用法)

  • 定義:在類的實現文件.m中定義類目,叫延展

定時器的使用

/*
     scheduledTimerWithTimeInterval 作用 :
     1.創建了一個定時器對象
     2.啓動了這個創建的定時器對象
     3.userInfo 用於將參數傳給定時器方法中的
     */

	NSArray *array = @[@"ad",@"mfmf"]
    //簡單用法
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1
				                                      target:self
				                                   	selector:@selector(timeAction:)
				                                   	userInfo:array
				                                     repeats:YES];
    
	-(void) timeAction:(NSTimer *)time{
		NSArray *array = timer.userInfo;
	 	_index++;
		if(_index == 5){
			//終止定時器
			[timer invalidate];
		}
	}

	    //timerWithTimeInterval : 只是創建了一個定時器對象,而沒有啓動這個定時器
    NSTimer *timer = [NSTimer timerWithTimeInterval:1
                            				target:self
                          				  selector:@selector(timeAction:)
                          				  userInfo:array
                           				   repeats:YES];
    
    //啓動定時器
    [timer fire];
	
	[[NSRunLoop currentRunLoop] run];

協議Protocol

  • 協議是定義了一組方法,讓其他類實現
  • 協議本身不是類
	@protocol/*聲明協議*/ Protocol <NSObject>
	@required//修飾協議方法 必須實現的
	-(void) finishTask;
	-(void) dontLate;
	@optional //可選實現
	@end

	/*
	* 簽訂者,在.h 文件中<協議>
	*/
	@interface Studnet :NSObject<Protocol>
	@end
	/*
	* .m 文件中直接實現
	*/
	@implementation Student
	-(void) finishTask{}
	-(void) dontLate{}
	@end

代理(委託)設計模式

  • 設計模式定義: 設計模式(Design Pattern) 描述了軟件開發過程中若干重複出現的問題的解決方案,目的是提高程序的課擴展性和維護性。
  • 利用協議(java 接口) 分別實現,接口方法來實現傳入對應的對象(類似java泛型)

內存管理

  • 概念: 內存管理是關於如何管理對象聲明週期的編程原則
  • 引用計數: 所有Objective-c的對象都有一個計數器,這個計數器我們成爲引用計數
    每個對象都有一個retainCount引用計數,表示當前對象被引用的數量
	1、調用retain方法,計數+1,調用release方法,計數減一
	2、當引用計數爲0時,說明沒有“引用”,此對象會被系統銷燬

alloc、retain、release

	 - alloc用來創建對象,創建完成後,引用計數爲1,只調用一次。
	 - retain是引用計數+1,可以調用多次。
	 - release使用引用計數-1,可以調用多次
	 - 當引用計數爲0時,對象會被系統內存中銷燬,銷燬之前,會調用此對象的dealloc方法

黃金法則: 如果對一個對象是用來額alloc,[mutable]copy,retain,那麼你必須使用相應的release或者autorelease釋放。

  • @property的使用 一個類有衆多屬性,需要使用@property 對所有的屬性定義set和get方法
	/**.h**/
	@interface User:NSObject{}
	/**
	*	@property的作用:
	*	1、生成一個_username的屬性,此屬性是private,不能被繼承的
	*	2、爲此屬性生成set/get方法	
	*/
	@property (1,2,3) NSString *username;
	@end


	/**.m**/
	@syntherize username = _name; (重命名)
1、原子性:	
	- atomic:多線程環境下,存在線程保護,默認
	- nonatomic:多線程環境下,不存在線程保護
2、賦值:
	- assign:直接賦值,默認(對象之外的類型,如基本數據類型、結構體類型)
	- retain:保留對象(所有對象)
	- copy:拷貝對象(NSString對象)
3、讀寫性:	
	- readwrite:生成getter,setter方法,默認
	- readonly:只生成getter方法
  • 自動釋放池
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
	//將對象添加到自動釋放池
	[pool addObject:(id)];
	//autorelease:將P對象添加到自動釋放池中,引用計數不會-1
	[p autorelease];
	//當自動釋放池銷燬的時候,會對池子中的每一個對象發送一個release消息(調用了release方法),如果p對象的引用計數是2 p對象的引用計數只會-1 並不會銷燬
	[pool release];
	//創建自動釋放池的簡便語法
	@autoreleasepool{
		[p autorelease];
	}
	//---------------自動釋放池的嵌套--------------
	NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init];
	//p1添加到pool1中
	[p1 autorelease];
	NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init];
	//p2添加到pool2中
	[p2 autorelease];
	
	[pool2 release];
	[pool1 release];
  • 如何持有對象所有權

  • 類方法創建的內存管理
    1、Foundation中的類可以通過alloc創建和類方法創建,區別在於內存管理不同
    2、類方法創建的對象是加入了自動釋放池

  • 循環使用
    定義:對象A retain 對象B。同時對象B retain對象A
    注意: 循環引用會導致兩個對象都無法銷燬

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章