2010-03-21 5 views
7

objc에서 C 구조체를 사용하고 있으며 Cocoa API에서와 같은 구조를 어셈블하는 함수를 만들었습니다. 이 구조체는 NSRect o NSPoint와 같지 않습니다.이 구조체는 objc 객체를 압축합니다. 여기에 잠재적 인 메모리 누수가 있습니다. 구조를 '해제'하는 기능을 제공해야합니까?ObjC 개체가 포함 된 C Structs 사용?

아무런 문제가 없으므로 ISKNewsCategory 클래스를 만들지 않겠지 만 이것이 좋은 접근 방법이라고 생각하십니까? 아니면 아무런 행동도하지 않게 클래스를 정의해야합니까?

typedef struct ISK_NewsCategory { 
    NSString *name; 
    NSString *code 
} ISKNewsCategory; 

NS_INLINE ISKNewsCategory ISKMakeNewsCategory(NSString *name, NSString *code) { 
    ISKNewsCategory category; 
    category.name = [name retain]; 
    category.code = [code retain]; 
    return category; 
} 

답변

8

일반적으로 간단한 컨테이너 클래스를 만드는 것이 훨씬 낫습니다. 그렇게하면 모든 메모리 관리가 쉽고 표준 Cocoa 컨테이너 클래스의 객체를 NSValue 또는 그 밖의 내용으로 구조체를 래핑하지 않고 사용할 수 있습니다.

개체 오버 헤드가 문제가 될 수있는 극히 성능이 중요한 코드가있는 경우에만이 방법으로 구조체를 사용할 수 있습니다.

@interface ISKNewsCategory : NSObject 
{ 
    NSString *name; 
    NSString *code; 
} 
@property (copy) NSString *name; 
@property (copy) NSString *code; 
@end 

@implementation ISKNewsCategory 
@synthesize name,code; 
- (void)dealloc 
{ 
    self.name = nil; 
    self.code = nil; 
    [super dealloc]; 
} 
@end 
+1

"유일한 시간"확장 : iterating 구조체는 반복 클래스보다 2-4 배 빠릅니다. 프로젝트가 커짐에 따라 이것은 실제 문제가되고 있습니다 (현재 프로젝트는 수십만 개의 항목을 자주 반복하고 실시간으로 실행해야합니다). – Adam

2

보유하고있는 것은 무엇이든 릴리스해야합니다. 그러나 당신이 그들을 지켜야한다고 말하는 것은 아무것도 없습니다. 구조가 객체를 "소유하고있는"경우, 그렇습니다. 유지해야하며 객체를 해제해야합니다. 그러나 개체가 다른 곳에 유지되면 개체를 유지하지 않는 약한 참조를 고려할 수 있습니다.

2

너무 행동이없는 클래스를 만드는 것은 싫지만. :/이것은 Objective-C의 슬픈 측면입니다. 클래스는 장황합니다.

C의 구조는 전달 될 때마다 복사된다는 것을 기억해야합니다. 따라서 구조가 객체를 보유하고 다른 객체에 객체를 제공하면 자동으로 객체의 참조 횟수가 잘못 계산됩니다.

개체를 전혀 지나칠 계획이라면 본격적인 수업으로 만들어야한다고 생각합니다. 그렇지 않다면, 간단한 구조체가 괜찮을 것입니다.

"소멸자"의 필요성에 따라, 소멸자가 있어야합니다. 당신의 구조를 위해 할 정리가 있다면 항상 하나 있어야합니다.

+0

실제로 복사만으로 포인터를 복사하기 때문에 개체를 직접 전달하는 것보다 더 많은 여분의 유지가 발생하지 않습니다. – cobbal

+0

@ 코발 : 이것은 내가 의미했던 것입니다. 구조체를 전달하면 객체에 대한 포인터가 복사되고, 살아있는 각 구조체에 대해 포인터를 유지하려는 경우에는 그렇게 할 수 없습니다. – zneak

0

이 솔루션이 도움이되기를 바랍니다.

typedef struct ISK_NewsCategory { 
    NSString *name; 
    NSString *code; 
} ISKNewsCategory; 

NS_INLINE ISKNewsCategory ISKMakeNewsCategory(NSString *inName, NSString *inCode) { 

    ISKNewsCategory category; 

    [category.name autorelease]; 
    category.name = [inName retain]; 

    [category.code autorelease]; 
    category.code = [inCode retain]; 

    return category; 
} 
관련 문제