【发布时间】:2013-06-25 06:31:15
【问题描述】:
我有一个从 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 用于我的委托属性。稍后再详细介绍...
我正在尝试编写一个以基于块的格式实现 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 在收到协议方法之前被释放)?
【问题讨论】:
-
不要在方法前面加上
get。 -
@bbum 我知道属性的“设置”是不可以的,但我没有意识到方法的“获取”被认为是错误的形式。将不得不更多地研究命名约定。还在学习:)
-
get保留用于通过引用返回内容的方法,并且很少使用。
标签: objective-c memory-management delegates automatic-ref-counting objective-c-blocks