相关疑难解决方法(0)

@synthesize vs @dynamic,有什么区别?

什么是实现之间的区别@property@dynamic@synthesize

cocoa cocoa-touch objective-c synthesize

553
推荐指数
7
解决办法
15万
查看次数

Objective-C - 只用下划线ivar合成的readonly属性?

如果我理解正确,在Objective-C中,属性会自动与getter和setter合成,实例变量声明为属性名称,并带有下划线prepended(_ivar).

所以,这段代码:

的main.m

#import <Foundation/Foundation.h>
#import "hello.h"

int main(int argc, char *argv[])
{

    @autoreleasepool {

        Hello *hello = [[Hello alloc] init];
        NSLog(@"%@", hello.myString);

        return 0;

    }

}
Run Code Online (Sandbox Code Playgroud)

hello.h

#import <Foundation/Foundation.h>

@interface Hello : NSObject
@property (copy, nonatomic) NSString *myString;
@end
Run Code Online (Sandbox Code Playgroud)

hello.m

#import "hello.h"

@implementation Hello

-(Hello *)init
{

    if (self = [super init]) {
        _myString = @"Hello";
    }

    return self;

}

-(NSString *)myString
{
    return [NSString stringWithFormat:@"%@ %@", _myString, @"World"];
}

@end
Run Code Online (Sandbox Code Playgroud)

可以像这样编译和运行:

bash-3.2$ clang -framework Foundation main.m …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c synthesize

28
推荐指数
1
解决办法
6572
查看次数

在Modern Objective-C中覆盖setter和getter时访问生成的ivars时出错

我现在知道新的Objective-C编译器让你不再需要合成你的属性了.我有一个文件,里面有两个类.我的.h是一个简单的帮助类,如下所示:

@interface ViewFrameModel : NSObject

@property (nonatomic, strong) UIView *view;
@property (nonatomic, assign) CGRect frame;

- (id)initWithView:(UIView *)view frame:(CGRect)frame;

@end
Run Code Online (Sandbox Code Playgroud)

在同一个.h文件中,对于我的其他类(第2类),我有:

@property (nonatomic, strong) ViewFrameModel *viewFrameModel;
Run Code Online (Sandbox Code Playgroud)

在2.m级,我可以这样做:

- (void)setViewFrameModel:(ViewFrameModel *)viewFrameModel {
    _viewFrameModel = viewFrameModel;        
    [self pushViewFrameModel:viewFrameModel];
}
Run Code Online (Sandbox Code Playgroud)

这很好,没有编译器的抱怨,但是,当我添加这个:

- (ViewFrameModel *)viewFrameModel {
    return _viewFrameModel;
}
Run Code Online (Sandbox Code Playgroud)

我得到两个投诉,一个是第一种方法setViewFrameModel:

"使用未声明的标识符_viewFrameModel,你的意思是viewFrameModel"

而另一个回归_viewFrameModel:

"使用未声明的标识符_viewFrameModel,你的意思是viewFrameModel""引用在封闭上下文中声明的局部变量viewFrameModel"

为什么我在添加时会出现这些错误

- (ViewFrameModel *)viewFrameModel {
    return _viewFrameModel;
}
Run Code Online (Sandbox Code Playgroud)

方法?我想用一些自定义信息覆盖这个方法,但它在抱怨我: - .思考?TIA.

properties objective-c getter-setter ios

19
推荐指数
2
解决办法
3316
查看次数

在超类中声明ivars或在子类中声明@synthesize?

当我@property在没有声明ivars的情况下声明一个超类中的子类时,将其子类化并尝试使用_propertyName子类中的超类ivar()实现getter ,xcode调用一个错误说明Use of undeclared identifier '_propertyName'.

什么是符合最佳编程实践的解决方案?

我应该@synthesize propertyName = _propertyName@implementation子类中还是

@interface SuperClass : AnotherClass
{
    Type *_propertyName;
}

@property Type *propertyName;

@end
Run Code Online (Sandbox Code Playgroud)

编辑:
我确实理解属性的访问器方法的自动"综合"和编译器创建的"underbar ivars".
可以通过 接口或实现部分中SuperClass没有任何@synthesizeivars声明或声明来实现ivar .

进一步澄清我的案例:免责声明:内容被窃取的Alfie Hanssen代码块

@interface SuperViewController : UIViewController
@property (nonatomic, strong) UITableView * tableView; // ivar _tableView is automatically @synthesized
@end

#import "SuperViewController.h"

@interface SubViewController : SuperViewController
// Empty
@end

@implementation SubViewController

- (void)viewDidLoad
{
    NSLog(@"tableView: %@", self.tableView); // …
Run Code Online (Sandbox Code Playgroud)

properties subclass objective-c

5
推荐指数
1
解决办法
4365
查看次数