一般來說,當你釋放一個對象的時候,內存不會被清零,只要有需要的人都可以自由回收。因此,如果你保留一個指向釋放對象的指針,你通常仍然可以使用該對象一段時間(就像你對第二條消息所做的那樣)。示例代碼:
#import <Foundation/Foundation.h>
@interface Foo : NSObject
@property(assign) NSUInteger canary;
@end
@implementation Foo
@synthesize canary;
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
Foo *foo = [[Foo alloc] init];
[foo setCanary:42];
[foo release];
NSLog(@"%li", [foo canary]); // 42, no problem
}
return 0;
}
默認情況下沒有對此進行檢查,行爲是簡單的未定義的。如果設置了NSZombieEnabled
環境值,消息代碼開始檢查釋放對象,應在你的情況下拋出一個異常,就像你可能預期:
*** -[Foo canary]: message sent to deallocated instance 0x100108250
順便說一句,在默認情況下,未選中的情況下是一個內存錯誤難以調試的原因,因爲行爲可能非常不確定(這取決於內存使用模式)。您可能會在代碼周圍出現奇怪的錯誤,而錯誤是其他地方的過度釋放對象。繼續前面的例子中:
Foo *foo = [[Foo alloc] init];
[foo setCanary:42];
[foo release];
Foo *bar = [[Foo alloc] init];
[bar setCanary:11];
NSLog(@"%li", [foo canary]); // 11, magic! (Not guaranteed.)
至於爲什麼是從NSMutableArray
NSArray
不同,一個空數組看起來確實是一個特殊的野獸:
NSArray *foo = [[NSArray alloc] init];
NSArray *bar = [[NSArray alloc] init];
NSLog(@"%i", foo == bar); // yes, they point to the same object
所以這可能是與它。但是在一般情況下,使用釋放對象可能會做任何事情。它可能有效,它可能不會,它可能會泄漏你的咖啡或開始一場核戰爭。不要這樣做。
空數組是ObjC中的一個特殊用例,就像字符串文字一樣。 –
爲什麼不使用便利的方法,比如'NSArray * array = [NSArray array];'來設置你的數組? –
@yulz如果他使用工廠方法,這個例子有什麼關係? – JustSid