我有一个从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
Q1-是的。正如您所指出的那样,使委托属性变弱是recommendation