1、assign、retain、copy使用環境
assign適合於基礎類型,基礎類型有c語言基礎數據類型(int, float, double, char,bool),obc基礎數據類型(NSInteger,CGFloat)
copy適合於NSString
retain適合於繼承NSObject的對象,包括NSNumber(只有NSNumber能存放在NSMutableArray),需要手動release
2、爲什麼很多內置的類,如TableViewController的delegate的屬性是assign不是retain
3、nil表示一個Objctive-C對象,這個對象的指針指向空,類似於c語言的NULL,Nil定義的是一個指向空的類(是Class非對象)
id是一個指向任何一個繼承了Object(或者NSObject)類的對象,id本身是一個指針,id *id則定義了一個指針,這個指針指向另一個指針
4、Xcode有四種build for
char 16 8
int 32 16(有符號:-32768至32767,無符號:0至65535)
short 16 16(類似int)
long 64 32(有符號:-2147483648至2147483627,無符號:0至4294967295)
float 32 32(類似無符號long)
double 64 64
longdouble - 128
6、
http://mobile.51cto.com/iphone-278593.htm
打包
Object-C內存管理口訣
1 口訣。
1.1 誰創建,誰釋放(類似於“誰污染,誰治理”)。如果你通過alloc、new或copy來創建一個對象,那麼你必須調用release或autorelease。換句話說,不是你創建的,就不用你去釋放。
例如,你在一個函數中alloc生成了一個對象,且這個對象只在這個函數中被使用,那麼你必須在這個函數中調用release或autorelease。如果你在一個class的某個方法中alloc一個成員對象,且沒有調用autorelease,那麼你需要在這個類的dealloc方法中調用release;如果調用了autorelease,那麼在dealloc方法中什麼都不需要做。
1.2 除了alloc、new或copy之外的方法創建的對象都被聲明瞭autorelease。
1.3 誰retain,誰release。只要你調用了retain,無論這個對象是如何生成的,你都要調用release。有時候你的代碼中明明沒有retain,可是系統會在默認實現中加入retain。不知道爲什麼蘋果公司的文檔沒有強調這個非常重要的一點,請參考範式2.7和第三章。
2 範式。
範式就是模板,就是依葫蘆畫瓢。由於不同人有不同的理解和習慣,我總結的範式不一定適合所有人,但我能保證照着這樣做不會出問題。
2.1 創建一個對象。
ClassA *obj1 = [[ClassA alloc] init];
2.2 創建一個autorelease的對象。
ClassA *obj1 = [[[ClassA alloc] init] autorelease];
2.3 Release一個對象後,立即把指針清空。(順便說一句,release一個空指針是合法的,但不會發生任何事情)
[obj1 release];
obj1 = nil;
2.4 指針賦值給另一個指針。
ClassA *obj2 = obj1;
[obj2 retain];
//do something
[obj2 release];
obj2 = nil;
2.5 在一個函數中創建並返回對象,需要把這個對象設置爲autorelease
ClassA *Func1()
{
ClassA *obj = [[[ClassA alloc]init]autorelease];
return obj;
}
2.6 在子類的dealloc方法中調用基類的dealloc方法
-(void) dealloc
{
…
[super dealloc];
}
2.7 在一個class中創建和使用property。
2.7.1 聲明一個成員變量。
ClassB *objB;
2.7.2 聲明property,加上retain參數。
@property (retain) ClassB* objB;
2.7.3 定義property。(property的默認實現請看第三章)
@synthesize objB;
2.7.4 除了dealloc方法以外,始終用.操作符的方式來調用property。
self.objB 或者objA.objB
2.7.5 在dealloc方法中release這個成員變量。
[objB release];
示例代碼如下(詳細代碼請參考附件中的memman-property.m,你需要特別留意對象是在何時被銷燬的。):
@interface ClassA : NSObject
{
ClassB* objB;
}
@property (retain) ClassB* objB;
@end
@implementation ClassA
@synthesize objB;
-(void) dealloc
{
[objB release];
[super dealloc];
}
@end
2.7.6 給這個property賦值時,有手動release和autorelease兩http://種方式。
void funcNoAutorelease()
{
ClassB *objB1 = [[ClassB alloc]init];
ClassA *objA = [[ClassA alloc]init];
objA.objB = objB1;
[objB1 release];
[objA release];
}
void funcAutorelease()
{
ClassB *objB1 = [[[ClassB alloc]init] autorelease];
ClassA *objA = [[[ClassA alloc]init] autorelease];
objA.objB = objB1;
}
另外:http://blog.sina.com.cn/s/blog_6abfa7ce0100vc26.html
http://www.cnblogs.com/woainilsr/archive/2012/03/28/2421881.html
http://www.cocoachina.com/applenews/devnews/2012/1126/5178.html