为委托人提供一个“强大”的参考文献可以吗?

问题描述 投票:19回答:4

我有一个从URL检索JSON并通过协议/委托模式返回数据的类。

MRDelegateClass.h

#import <Foundation/Foundation.h>

@protocol MRDelegateClassProtocol
@optional
- (void)dataRetrieved:(NSDictionary *)json;
- (void)dataFailed:(NSError *)error;
@end

@interface MRDelegateClass : NSObject
@property (strong) id <MRDelegateClassProtocol> delegate;

- (void)getJSONData;
@end

请注意,我正在将strong用于我的代理人属性。稍后更多...

我正在尝试编写一个'wrapper'类,该类以基于块的格式实现getJSONData。

MRBlockWrapperClassForDelegate.h

#import <Foundation/Foundation.h>

typedef void(^SuccessBlock)(NSDictionary *json);
typedef void(^ErrorBlock)(NSError *error);

@interface MRBlockWrapperClassForDelegate : NSObject
+ (void)getJSONWithSuccess:(SuccessBlock)success orError:(ErrorBlock)error;
@end

MRBlockWrapperClassForDelegate.m

#import "MRBlockWrapperClassForDelegate.h"
#import "MRDelegateClass.h"

@interface DelegateBlock:NSObject <MRDelegateClassProtocol>
@property (nonatomic, copy) SuccessBlock successBlock;
@property (nonatomic, copy) ErrorBlock errorBlock;
@end

@implementation DelegateBlock
- (id)initWithSuccessBlock:(SuccessBlock)aSuccessBlock andErrorBlock:(ErrorBlock)aErrorBlock {
    self = [super init];
    if (self) {
        _successBlock = aSuccessBlock;
        _errorBlock = aErrorBlock;
    }
    return self;
}

#pragma mark - <MRDelegateClass> protocols
- (void)dataRetrieved:(NSDictionary *)json {
    self.successBlock(json);
}
- (void)dataFailed:(NSError *)error {
    self.errorBlock(error);
}
@end

// main class
@interface MRBlockWrapperClassForDelegate()
@end

@implementation MRBlockWrapperClassForDelegate

+ (void)getJSONWithSuccess:(SuccessBlock)success orError:(ErrorBlock)error {
    MRDelegateClass *delegateClassInstance = [MRDelegateClass new];
    DelegateBlock *delegateBlock = [[DelegateBlock alloc] initWithSuccessBlock:success andErrorBlock:error];
    delegateClassInstance.delegate = delegateBlock; // set the delegate as the new delegate block
    [delegateClassInstance getJSONData];
}

@end

我最近才进入Objective-C世界(仅在ARC时代生活过,并且仍然对块有所了解),但我对内存管理的理解显然是苗条的。

此代码似乎工作正常,但前提是我的委托人为strong。我知道我的代表应为weak,以避免潜在的保留周期。从工具上看,我发现分配不会随着呼叫的增加而继续增长。但是,我认为“最佳实践”是让weak位代表。

问题

Q1)拥有strong位代表是否可以”>

Q2)我如何实现基于块的包装,而将基础类的委托保留为weak委托(即,防止* delegateBlock在接收协议方法之前被释放)?

我有一个从URL检索JSON并通过协议/委托模式返回数据的类。 MRDelegateClass.h #import @protocol MRDelegateClassProtocol @ ...

objective-c memory-management delegates automatic-ref-counting objective-c-blocks
4个回答
15
投票

Q1-是的。正如您所指出的那样,使委托属性变弱是recommendation


13
投票
这完全取决于对象的体系结构。

10
投票
您是正确的,通常很少引用代表。但是,在某些使用案例中,首选或什至需要强引用。苹果在NSURLConnection中使用此代码:

0
投票
正如其他人所说,这与建筑有关。但是,我将通过几个示例向您介绍:
© www.soinside.com 2019 - 2024. All rights reserved.