繁体   English   中英

为Objective-C属性创建自定义获取器

[英]Create a custom getter for an Objective-C property

我刚刚开始学习Objective-C,然后我开始制作一个基本程序来创建一个人并打印出其名字。 但是,它不起作用。 您认为我犯了什么菜鸟错误?

main.m:

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

int main(int argc, const char * argv[])
{
    Person *Bob;
    [Bob setFirstName:@"John"];
    [Bob setLastName:@"Smith"];
    NSLog(@"%@", [Bob fullName]);
}

人.h:

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    NSString *firstName;
    NSString *lastName;
}

- (void) setFirstName: (NSString*)input;
- (void) setLastName: (NSString*)input;

- (NSString*) firstName;
- (NSString*) lastName;
- (NSString*) fullName;

@end

人.m:

#import "Person.h"

@implementation Person

//  Getters
- (NSString*) firstName
{
    return firstName;
}
- (NSString*) lastName
{
    return lastName;
}
- (NSString*) fullName
{
    return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
}

//  Setters
- (void) setFirstName:(NSString *)input
{
    firstName = input;
}
- (void) setLastName:(NSString *)input
{
    lastName = input;
}

@end

注意:此问题最初是在Code Review StackExchange上提出的,但他们将其关闭了:-(

它不起作用的原因是因为您从未正确分配Person对象。

注意,您从未说过Bob = [[Person alloc]init]; Objective-C消息传递对空指针没有任何作用,因此这就是为什么您没有得到NullPointer类的原因的原因。 它只是默默地被忽略。

对于诸如firstNamelastName类的@property ,您无需创建设置器和获取器,这是自动完成的。 对于自定义的setter和getter,您将需要创建它们,例如fullName属性。 您还需要分配和初始化Person类。 下面的示例应该起作用:

主目录

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

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

    @autoreleasepool {

        Person *bob = [[Person alloc] init];
        bob.firstName = @"Bob";
        bob.lastName = @"Williams";

        NSLog(@"Full name is %@",bob.fullName);

    }

    return 0;
}

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (copy,nonatomic) NSString *firstName;
@property (copy, nonatomic) NSString *lastName;
@property (copy, nonatomic) NSString *fullName;

@end

#import "Person.h"

@implementation Person

- (NSString *)fullName {
    return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}

@end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM