2013-04-05 2 views
0

내가 이렇게 같은 블록이 있다고? 이 블록은 다른 객체에 대해 작동하며 객체가 nil 인 경우 할당해야합니다. 이 상태에서 일부 개체는 범위에 할당됩니다 (따라서 obj이 할당되지만 someObject은 할당되지 않음). ive는 __block를 사용하여 시도했지만, 그게 뭔지는 생각하지 않습니다. 샘플에 대한블록에 매개 변수 개체에 새로운 객체를 할당

답변

1

ㅁWh 그것은 매개 변수가되고 블록은 함수처럼 작동합니다. 여기에서하는 일은 Apple의 API에서 NSErrors를 처리하는 방법과 유사합니다.

이 시도 :

Object * someObject = nil; 

block = ^(Object **obj){ 

    if(obj != nil && *obj == nil) 
     *obj = [[Object alloc] init]; 
}; 

block(&someObject); //someObject is still nil 
block(&someObject); //it will assign again, instead of not 

NSLog(@"result: %@", someObject); 
+0

아아 버거,이 작동하지 않으며 대답이지만, 어쨌든, 당신은 변수가 어쨌든 헤더를 정의 할 수있는 변수를 사용하는 것처럼 보일 수 있습니다. 백엔드를위한 __autoreleasing 매개 변수에 로컬 객체 ' – Fonix

+0

다른 방법은 __block 변수를 사용하고 다른 변수에 의해 제안 된 것처럼 매개 변수로 사용하지 않는 것입니다. 나는 중간에 방법이 있다고 생각하지 않습니다. – svena

+0

빌어 먹을,이 블록을 객체 + 일부 다른 설정 코드에서 처리하기 위해이 블록을 전달하기를 원했기 때문에 someObject가 어디에서 달라지기 때문에 로컬 변수로 사용할 수 없습니다 ... 오, 잘 아프지 만 다른 방법을 찾아야합니다. – Fonix

1

-이 유사 헤더 또는 뭔가 typdef 선언이 좋아 다음

typedef void (^ActionBlock)(NSArray **array); 

및 사용 :

__block NSArray *array = nil; 
NSLog(@"Before: %@",array); 
ActionBlock block = ^(NSArray **array) 
{ 
    if(*array == nil) 
     *array = [[NSArray alloc] init]; 
}; 
block(&array); 
NSLog(@"After: %@",array); 

출력 :

2013-04-05 21:05:23.153 TestingSuite[62813:c07] Before: (null) 

2013-04-05 21:05:23.155 TestingSuite[62813:c07] After: (
) 

희망을 도움이

+0

하지만 아무 소용이 ... 어쩌면 나는를 작성합니다 – Fonix

+0

하지만 뭔가 빠진 메신저 샘플 - 내놔 –

3

또한이 방법 갈 수 : 그 시도

__block Object someObject = nil; 
block = ^(void) 
{ 
    if(someObject == nil) 
    someObject = [[Object alloc] init]; 
} 
block(); 
+0

, 이럴 수는 없습니다. 이 블록은 여러 장소에 존재하고 객체는 블록이 실행되는 컨텍스트에서 오지 않기 때문에 – Fonix

관련 문제