2012-04-21 2 views
1

개체를 만드는 방법은 bytes입니다. 사과 문서에서dataWithBytesNoCopy : 길이 : 메모리 관리

-(NSData *)dataFromBytes 
{ 
... 
    void *data = malloc(bytes); 
... 
    return [NSData dataWithBytesNoCopy:data length:bytes];; 
} 

는 :

반환되는 객체는 바이트 포인터의 소유권을하고 해제에 그것을 를 해제합니다.

발신자 기능에서 데이터 개체를 반환해야합니까?

-(void)testFunction 
{ 
NSAutoreleasePool *nsp = [[NSAutoreleasePool alloc] init]; 

NSData *ldata = [mObject dataFromBytes]; 
NSlog(@"%@", ldata)//printing data 
[nsp release]; 
NSlog(@"%@", ldata)//Not printing data //sometimes getting exc_bad_access 

} 
+1

객체가 하나의 소유권을 갖기 때문에 객체의 메모리 관리 규칙이 변경되지 않습니다 개체의 해제 여부는 [규칙] (http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles)에 명시된대로 메서드의 이름에 따라 결정됩니다. /mmRules.html) –

+0

@PeterHosey 고마워. 질문이 하나 더 있는데 왜 내 응용 프로그램이 10.6 및 10.7에서 제대로 작동하는지 (반환 된 데이터 개체가 릴리스 됨) –

+0

가끔 10.5에서 충돌합니다. –

답변

7

짧은 답변 : 그것을 유지 한 경우 아니, 호출자는 반환 된 데이터를 해제해야합니다. 귀하의 testFunction에서 귀하는 그것을 보유하지 않으므로 귀하가 그것을 풀어서는 안됩니다.

긴 대답 : 첫째, 당신의 위의 코드에서 dataFromBytes 방법은 아마도이 실제로 NSData *를 반환해야합니다, 반환 값이 없습니다.

어쨌든 dataWithBytesNoCopy:length: 메서드는 메서드에서 즉시 반환되는 autoreleased NSData 인스턴스를 반환합니다. 메서드 이름에 init, new 또는 copy가 포함되어 있지 않기 때문에 자동으로 변환된다는 것을 알고 있습니다. 즉, 호출자가 이 아니고이 자동으로 반환 된 데이터의 소유권을 가져 오므로이를 해제하지 않아야합니다 (보유하지 않는 한).

malloc 된 data의 소유권은 NSData 객체에 의해 인계되며 해제되어서는 안됩니다. NSData 인스턴스가 dealloc 될 때 그것은 malloc 된 메모리를 해제 할 것이다.

testFunctionNSData 개체가 있고 인쇄 중입니다. 다음으로 autorelease 풀을 해제하면 autoreleased 오브젝트가 해제되고 dealloc 될 것입니다. 당신은 그것을 다시 인쇄 할 수 있지만 그것은 이미 위험한 dealloc'ed되었습니다 (나는 항상 EXC_BAD_ACCESS이 아닌것에 놀랐습니다.)

+0

오케이. 고맙습니다. 내 응용 프로그램이 10.6 및 10.7에서 제대로 작동하는 이유 (반환 된 데이터 객체의 릴리스가 있음). 10.5에서 가끔 충돌합니다. –