문제

나는 iPhone 개발을 위해 한동안 일하고 있습니다. 처음으로, 나는 Objective-C에서 메모리 관리에 너무 놀랐습니다 :). 그러나 지금 나는 그것을 조금 얻었다.

문제는 언젠가 프로토콜을 클래스의 속성으로 사용한다는 것입니다. 왜냐하면 그 정의는 C# 또는 Java의 '인터페이스'와 매우 유사하다고 생각하기 때문입니다. 아래처럼.

@protocol Shield
   ...
@end

// Interface
@interface Dragon {
    id<Shield> shield
    NSString * name;
}

@property (nonatomic,retain) id<Shield> shield;
@property (nonatomic,retain) NSString * name;

@end

그러나 나는 Dealloc () 메소드에서 모든 속성 객체를 릴리스합니다. 아래처럼.

-(void)dealloc {
   [name release];
   [shield release];  // <--- Totally impossible. xcode said '-release not found in protocol'
   [super dealloc];
 }

보시다시피, 나는 프로토콜을 공개 할 수 없었습니다. 그래서 이것이 미래의 기억 문제를 일으킬까요? 이 솔루션을 처리하여 저에게 조언하는 다른 방법이 있습니까?

도움이 되었습니까?

해결책

프로토콜을 준수하는 것으로 정의해야합니다. NSObject 다음과 같은 프로토콜 :

@protocol Shield <NSObject>
   ...
@end

방법을 알면 간단합니다! ;-)

편집 : 또한 올바른 - Objective -C의 프로토콜은 Java 및 C#의 인터페이스와 동일합니다.

또 다른 편집 :이 작업을 수행하는 것이 이상하게도 타격을 줄 수 있지만 Objective-C는 여러 개의 루트 객체를 허용하므로 모든 객체가 내려 오는 것을 실제로 보장 할 수는 없습니다. NSObject. 부터 release 이다 NSObject 방법, 당신은 당신의 프로토콜을 <NSObject> 프로토콜이 release 방법.

다른 팁

1- [방패 릴리스] 대신에해야 할 적절한 일이 설정됩니다.

self.shield = nil;

2- 또한 변화

@property (nonatomic,retain) id<Shield> shield; 

에게

@property (nonatomic,assign) id<Shield> shield;

그렇다면 당신은 괜찮습니다.

편집하다:

보유 대의원을 피하는 이유는 유지 루프를 피해야하기 때문입니다.

A는 BA를 B의 대의원으로 설정합니다… A는 소유자가 공개합니다.

B가 A를 유지했다면 A는 A를 소유하고 있으므로 A가 해제되지 않으므로 A의 거래는 절대 호출되지 않아 A와 B가 모두 누출되지 않습니다.

B/C가 B/C를 소유하고있는 것에 대해 걱정하지 않아야하므로 Dealloc에서 제거합니다.

대상 C 대표단이 일반적으로 보유 대신 재산 할당을받는 이유는 무엇입니까?

예제 프로토콜 선언은 uitableview 클래스 참조를 참조하십시오.

@property (비 원자, 할당) id <uitableviewdelegate> delegate

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top