我測試了以下代碼。爲什麼傳入塊的變量沒有被處理?
// Employee.h
@interface Employee : NSObject
@property(nonatomatic, copy) void (^print)(void);
@end
// Employee.m
@implementation Employee
@synthesize print = _print;
- (void)dealloc {
[_print release];
[super dealloc];
}
@end
// main.m
int main() {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
Employee* john = [[[Employee alloc] init] autorelease];
john.print = ^{
NSLog(@"block test %@", john);
};
[pool drain];
}
在這種情況下,不會調用變量「john」的dealloc。 但是,如果我不記錄約翰變量(就像NSLog(@「block test」)),那麼它調用dealloc。 會出現什麼問題?
謝謝!我還有一個問題。當john.print被執行時,約翰被保留了嗎? – Daoxin 2012-07-19 05:54:23
@Daoxin當'john'被自動保留的時候,'print'屬性被分配。編譯器會自動執行此操作,以確保在執行塊中的代碼之前不會解除分配「john」,這可能稍後會過時。在異步回調模塊的情況下。 – tia 2012-07-19 09:05:04