This question already has answers here:
If a subclass refers to a superclass ivar, synthesizing an unrelated property fails
(3个答案)
7年前关闭。
当我对它们进行
当我删除@synthesize时,@ properties的行为符合预期。
这是一个基本示例,称为
ViewController.h
ViewController.m
SubClassedViewController.h
SubClassedViewController.m
@synthesize的行为
除非我使用
请注意,如果我在代码中放入
没有@synthesize的行为
如果我注释掉
然后,我得到以下不同的行为(这是我期望的行为)
问题
这是错误,还是我误会了?
如果这是一个错误(这是我的假设)...
是Xcode,调试器还是编译器中的错误?
如果这不是错误...
我正在使用Xcode 4.6.1,不需要我@synthesize
东西。但我的应用程式的行为是否不应该相同
不是吗 为什么属性指向其“所有者”有意义?
正在将自动释放的对象存储到ivar中,这意味着它将被释放,并且ivar将容纳一个垃圾对象。正确的解决方法可能是说
它将调用设置器并为您保留值。
此外,我建议完全删除您的ivar声明,并删除
(3个答案)
7年前关闭。
当我对它们进行
@synthesize
然后对控制器进行子类化时,我在调试器中有一些@properties行为异常。当我删除@synthesize时,@ properties的行为符合预期。
这是一个基本示例,称为
ViewController
的SubClassedViewController
子类。ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
NSNumber *someNumber;
}
@property (nonatomic, strong) NSNumber *someNumber;
@end
ViewController.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
SubClassedViewController.h
#import "ViewController.h"
@interface SubClassedViewController : ViewController
@end
SubClassedViewController.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
,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>
问题
如果这是一个错误(这是我的假设)...
如果这不是错误...
东西。但我的应用程式的行为是否不应该相同
不是吗
最佳答案
这不是“奇怪的行为”。您正在获取垃圾对象,因为您的代码错误。
删除@synthesize
时,编译器会自动使用名称_someNumber
合成ivar。这会导致-viewDidLoad
中的错误代码实际上什么也不做。值得注意的是,
someNumber = [NSNumber numberWithInt:123];
正在将自动释放的对象存储到ivar中,这意味着它将被释放,并且ivar将容纳一个垃圾对象。正确的解决方法可能是说
self.someNumber = [NSNumber numberWithInt:123];
它将调用设置器并为您保留值。
此外,我建议完全删除您的ivar声明,并删除
@synthesize
,然后让编译器合成您的ivar。关于ios - @synthesized时,@ properties在调试器中的行为异常,然后在子类中对其进行访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15487874/
10-10 17:35