簡體   English   中英

如何使自己在MRC中變得虛弱?

[英]How to make weak self in MRC?

Message *m = [msg retain];
dispatch_queue_t queue = _handle_queue;
__block ProtocolDriver* blockSelf = self;
dispatch_async(queue, ^{
    if (blockSelf.protocol_delegate && [blockSelf.protocol_delegate respondsToSelector:@selector(onReceive:)]) {
        [blockSelf.protocol_delegate onReceive:m];
    }
});

我有一個MRC Objective-C文件,該文件需要異步運行某些代碼塊。

但是我認為該blockself本身並不安全,因為它不是弱指針,是否應該將其更改為真正的弱指針。

@interface WeakPtr : NSObject
@property (nonatomic, weak) id realObj;
@property (nonatomic, assign) bool released;
@end
@implementation WeakPtr
@end

設置釋放MRC對象時的釋放,並在塊中對其進行測試

@property (nonatomic, retain) WeakPtr* selfPtr;
- (id)init{
    ...
    self.selfPtr = [[[WeakPtr alloc] init] autorelease];
    self.selfPtr.realObj = self;
}

- (void)dealloc
{
    ...
    self.selfPtr.released = true;
}

-(void)pump: (Message *)msg
{
    Message *m = [msg retain];
    dispatch_queue_t queue = _handle_queue;

    __block WeakPtr* weakSelf = self.selfPtr;
    dispatch_async(queue, ^{
        if (!weakSelf.released && [weakSelf.protocol_delegate respondsToSelector:@selector(onReceive:)]) {
            [weakSelf.protocol_delegate onReceive:m];
        }
    });
}

當然是。

1)制作一個ARC弱指針包裝器類。

@interface WeakPtr : NSObject
@property (nonatomic, weak) id realObj;
@end
@implementation WeakPtr
@end

2)在MRC中使用ARC弱指針包裝器包裝強指針。

-(void)pump: (Message *)msg
{
    Message *m = [msg retain];
    dispatch_queue_t queue = _handle_queue;
    WeakPtr* weakPtr = [WeakPtr new];
    weakPtr.realObj = self;
    dispatch_async(queue, ^{
        if ([weakPtr.realObj.protocol_delegate respondsToSelector:@selector(onReceive:)]) {
            [weakPtr.realObj.protocol_delegate onReceive:m];
        }
        [weakPtr release];
    });
}

另一個選項是-fobj-weak編譯器標志。

簡短的回答:不能。 weak限定符是ARC的功能。 在MRC中,類型是分配的,它等效於ARC的unsafe_unretained類型。

MRC沒有自動插入弱類型。

編輯:

好的,也許“你不能”太強了。 最好說:

MRC不支持自動設置弱引用,因此您必須使用應用程序級代碼或為您提供幫助的庫來處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM