为Objective-C属性创建自定义getter

fel*_*hew 0 properties objective-c

我刚刚开始学习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]);
}
Run Code Online (Sandbox Code Playgroud)

Person.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
Run Code Online (Sandbox Code Playgroud)

Person.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
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*dro 8

它无法工作的原因是因为您从未Person正确分配过对象.

注意你从未说过Bob = [[Person alloc]init];.Objective-C消息传递对null指针没有任何作用,所以这就是为什么你没有得到像NullPointer.它只是默默地被忽略了.


wig*_*ing 5

对于@property诸如此类firstNamelastName您不需要创建 setter 和 getter,这是自动完成的。对于自定义 setter 和 getter,您需要创建它们,例如属性fullName。您还需要分配和初始化您的Person类。以下示例应该有效:

主程序.m

#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;
}
Run Code Online (Sandbox Code Playgroud)

人.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

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

@end
Run Code Online (Sandbox Code Playgroud)

人.m

#import "Person.h"

@implementation Person

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

@end
Run Code Online (Sandbox Code Playgroud)