Tamam, gittim ve Xcode ile biraz oynadım, ve işte neler olduğuyla ilgili bir model var. O dealloc
nesneler alloc'ed
çağrılacak neden ne gibi görünüyor, ama bloğunun içinde autoreleased böylece
Yukarıda kullanılan blok özel hiçbir şey yapmıyor
ancak enumerateObjectsUsingBlock
kodu NSAutoreleasePool
kendi gibi görünüyor.
Aşağıdaki kod yukarıda gördüğüm şey davranış ile eşleşen Ben innerPool
nesneyi kaldırırsanız Aslında beklendiği gibi
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// simple block test - just iterate over some items and
// add them to a string
typedef void (^AccArrayBlock)(id obj, int idx, BOOL *stop);
// items to 'process'
NSArray *items = [NSArray arrayWithObjects:@"why ", @"must ", @"this ",nil];
int idx = 0;
BOOL doStop = NO;
// make sentence mutable, so we can assign it inside block
__block NSString *sentence = @"";
// make a similar block to what we'd pass to enumerate...
AccArrayBlock myBlock = ^(id obj, int idx, BOOL *stop)
{
// returns and assigns an autoreleased string object
sentence = [sentence stringByAppendingFormat:@"(%d) %@ ",idx,obj];
};
// enumerate items and call block
for (NSString *item in items) {
// create a pool to clean up any autoreleased objects in loop
// remove this line, and the sentence will be valid after loop
NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init];
myBlock(item, idx++, &doStop);
// drain the pool, autorelease objects from block
[innerPool drain];
if (doStop) {
break;
}
}
// faults if we drained the pool
// Program received signal: “EXC_BAD_ACCESS”.
NSLog(@"Sentence is %@",sentence);
[pool drain];
return 0;
}
, ardından kod çalışır ve muhtemelen NSRunLoop
havuz sonunda temizler çeşitli NSString
nesneleri.
NOT:
Google 'enumerateObjectsUsingBlock+autorelease'
ilk sonuç bu cevabı onaylar: Bu iş parçacığı şimdi 'enumerateObjectsUsingBlock autorelease' sayısının 2 hakkında sonucudur. Hepinize teşekkürler.
Wow, bu garip, bunun neden çalışmadığından emin değilim. – jtbandes
İnsanların bir şeyleri geri döndürmek için blokların sonunda bir [[bazı Değişkeni rehin tutmama] otomatikleştirmesi] yaptığını gördüm, ancak bir otorit havuzunun çalıştığından şüphelenirsem bunun neden bir fark yarattığından emin değilim. Yine de bilmiyorum, bu yüzden soruyorum ve blokları kopyalayıp etrafta dolaşan her tür eşya var, ama basit olması gereken bir şeyde bulabileceğim hiçbir şey yok. –
Aldığınız hata/istisna nedir? – nacho4d