IOS 6.1IOS RemoveObserver的鍵值對異常會導致額外的保留計數爲ARC
我們已經注意到,當我們得到removeObserver的鍵值對的例外是不存在的,具有KVP得到的類並從removeObserver調用中額外保留計數。
以下是一些證明這一點的測試代碼。還有一個橋接版本解決了這個問題。
任何意見,歡迎....
#import "ViewController.h"
#import "ClassA.h"
@interface ViewController()
@property (strong, nonatomic) ClassA* classA;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"radarOn"])
{
NSLog(@"--- here in radaron");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Here" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
}
- (IBAction)CreateClassAAction:(id)sender
{
self.classA = [[ClassA alloc] init];
}
- (IBAction)SendNotificationAction:(id)sender
{
self.classA.radarOn = ! self.classA.radarOn;
}
- (IBAction)ClearKVPAction:(id)sender
{
@try
{
[self.classA removeObserver:self forKeyPath:@"radarOn"];
}
@catch (NSException *exception)
{
NSString *s = [NSString stringWithFormat:@"Exception ClassA Retain Count %ld %@", CFGetRetainCount((__bridge CFTypeRef)(self.classA)), exception.description];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:s delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
// this will let the class release
// CFBridgingRelease((__bridge CFTypeRef)(self.classA));
}
}
- (IBAction)AddKVPAction:(id)sender
{
[self.classA addObserver:self forKeyPath:@"radarOn" options:NSKeyValueObservingOptionNew context:nil];
}
@end
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@property (nonatomic, assign) BOOL radarOn;
@end
#import "ClassA.h"
@implementation ClassA
- (void) dealloc
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"ClassA Dealloc" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
@end
'ClearNotificationsAction'應該做什麼?你不應該從'UIViewController'在默認通知中心調用'removeObserver:';你不能保證你的超類可能已經註冊了哪些通知。由於這似乎是ARC啓用,我不確定你可以可靠地使用'reatainCount'。您是否使用過儀器來確認它正在泄漏? – ppilone
這只是另一個測試,可以忽略這個討論。將刪除。當然還有文書,否則不會發布。該版本旨在允許該類由於保留計數錯誤而被釋放。 – ort11
問題解決了。這是一個例外/ ARC問題,而不僅僅是一個removeObserver問題。當我可以但將詳細答案,而不是self.classA removeObserver使用_classA removeObserver – ort11