2016-12-13 16 views
-1

私はARCとプロジェクトの違いを勉強しています。 私はプロトコルを実装する必要があるカスタムライブラリを使用しますが、ARCなしのプロジェクトではコールバック(onEvent)が呼び出されますが、ARCプロジェクトでは発生しません。ARCが動作していないプロトコル

私は、プロトコルコードへのアクセスを持っていない - それはのonEvent()コールバックと呼ばれています -をしかし、私は、私は次の実装間違っていると思う:

のViewController:

@implementation ViewController 

- (IBAction)pressed:(id)sender { 
    ObjectA *sd = [[ObjectA alloc] init]; 

    [sd startWith:@"myString"]; 
} 

インタフェースObjectAに:

@interface ObjectA : NSObject <MyProtocol> 

@property (nonatomic, strong) id<MyProtocol> myProtocol; 
- (void) startWith:(NSString *)myString; 
@end 

実装をObjectA:

- (void) startWith:(NSString *)myString 
{ 

    id<MyProtocol> protocolDelegate = self; 
    self.myProtocol = [[ObjectB alloc] init: protocolDelegate]; 
    [self.myProtocol doStuff]; 
} 

- (void) onEvent 
{ 
    NSLog(@"Called"); 
} 

インタフェースをObjectB:

@interface ObjectB : NSObject<MyProtocol> 

質問は以下のとおりです。なぜARCプロジェクトで "のonEvent" と呼ばれていませんか?

ありがとうございます。

編集:私はこの方法でのViewControllerを変え解決した

@interface ViewController() 
    @property (nonatomic, strong) ObjectA *sd; 
    @end 

     @implementation ViewController 
    - (void)viewDidLoad { 
     _sd = [[ObjectA alloc] init]; 
    } 
    - (IBAction)pressed:(id)sender {  
     [sd startWith:@"myString"]; 
    } 
+1

私は 'onEvent'の呼び出しを見ません。 – shallowThought

+0

私が言ったように、私はプロトコルをコード化するためのアクセス権を持っていません。このプロトコルはライブラリから使用されるためです。 –

+0

を理解してください。 '@property(nonatomic、strong)TypeOfClassFromLibrary myLibClassInstance;'プロパティを作成する必要があります。次に 'viewDidLoad'の中で:' self.myLibClassInstance = [[TypeOfClassFromLibrary alloc] init]; self.myLibClassInstance.nameOfProtocol = self; ' – shallowThought

答えて

0

あなたの説明とあなたのソリューションに基づいて、私は説明しています。

手動リファレンスカウント(非ARC)バージョンは、メモリリークのために機能しました。

- (IBAction)pressed:(id)sender { 
    ObjectA *sd = [[ObjectA alloc] init]; 

    [sd startWith:@"myString"]; 
} 

押すたびにObjectAのインスタンスが割り当てられましたが、あなたが見ることができるように、それは戻っていない、それが保存されていない、そしてそれがリリースされていないだと呼ばれていました。だからインスタンスがちょうど流出した。

-onEventコールバックでは、漏れたインスタンスObjectAが残っていました。下側はあなたが記憶を漏らしていたということでした。

+0

はい、これは問題です。実際、「解析」ツールを使用してメモリリークが発生したため、私はこの問題を解決しました。あなたの説明をありがとう。 –

関連する問題