我有一些@properties 在调试器中表现得很奇怪,@synthesize
然后我将它们子类化为控制器。
当我删除 @synthesize 时,@properties 的行为符合预期。
这是一个基本示例,一个ViewController
名为SubClassedViewController
.
视图控制器.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
NSNumber *someNumber;
}
@property (nonatomic, strong) NSNumber *someNumber;
@end
视图控制器.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize someNumber; //Strange behavior unless I remove this line
- (void)viewDidLoad
{
[super viewDidLoad];
someNumber = [NSNumber numberWithInt:123];
// Do any additional setup after loading the view, typically from a nib.
}
@end
子类视图控制器.h
#import "ViewController.h"
@interface SubClassedViewController : ViewController
@end
子类视图控制器.m
#import "SubClassedViewController.h"
@interface SubClassedViewController ()
@end
@implementation SubClassedViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}
@synthesize 的行为
除非我使用self.
,否则对象指向子类控制器,而不是 NSNumber:
(lldb) po someNumber
$3 = 0x07151a30 <SubClassedViewController: 0x7151a30>
(lldb) po self.someNumber
$4 = 0x08c37f20 123
(lldb) p (int)[someNumber intValue]
error: Execution was interrupted, reason: Attempted to dereference an invalid ObjC Object or send it an unrecognized selector.
The process has been returned to the state before execution.
(lldb) po (UIView*)[someNumber view]
$7 = 0x071574f0 <UIView: 0x71574f0; frame = (0 20; 320 548); autoresize = RM+BM; layer = <CALayer: 0x71575a0>>
请注意,如果我将NSLog
s 放入我的代码中, someNumber 会正确指向 NSNumber;它仅在 lldb 中被标识为 SubClassedViewController(据我所知)。
没有@synthesize 的行为
如果我注释掉@synthesize
并将 ViewController.m 中的 NSNumber 创建更改为:
_someNumber = [NSNumber numberWithInt:123]; //I added _ before variable name
然后我得到以下不同的行为(这是我期望的行为)
(lldb) po _someNumber
$0 = 0x0717db70 123
(lldb) po self.someNumber
$1 = 0x0717db70 123
(lldb) po self
$2 = 0x071853a0 <SubClassedViewController: 0x71853a0>
问题
- 这是一个错误,还是我误解了什么?
如果这是一个错误(这是我的假设)......
- 它是 Xcode、调试器还是编译器中的错误?
如果这不是错误...
我正在使用 Xcode 4.6.1,它不需要我 @synthesize 东西。但是无论我是否这样做,我的应用程序的行为是否应该相同?
为什么属性指向它的“所有者”会有意义?