類目
- 定義:類目可以爲一個現有的類擴展新的方法,擴展的方法會成爲原始類的一部分且可以被子類繼承
- 創建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
注意: 循環引用會導致兩個對象都無法銷燬