目标C:类方法说明

Bun*_*ori 4 xcode objective-c

作为从C++到Objective-C的过渡过程的一部分,我深入阅读了Cocoa和Objective C Up and Running一书.

在其中一本书代码示例中,有一条线对我目前的知识水平没有意义:

它是类方法的声明+ (Photo*) photo;.

任何人都可以解释一下原因,请问为什么作者决定将方法(Photo*) photo;声明为类方法而不是实例方法

我已经研究过这个理论,即instane方法类似于类成员函数,而类方法就像C++中的静态函数.但这仍然没有回答我的问题.

这是声明代码:

#import <Foundation/Foundation.h>


@interface Photo : NSObject{

    NSString* caption;
    NSString* photographer;    
}

+ (Photo*) photo;

- (NSString*) caption;
- (NSString*) photographer;

- (void) setCaption: (NSString*)input;
- (void) setPhotographer: (NSString*)input;

@end
Run Code Online (Sandbox Code Playgroud)

实现代码如下:

#import "Photo.h"


@implementation Photo

- (id)init
{
    self = [super init];
    if (self) {
        [self setCaption:@"Default Caption"];
        [self setPhotographer:@"Default Photographer"];
    }

    return self;
}


+ (Photo*) photo {
    Photo* newPhoto = [[Photo alloc] init];
    return [newPhoto autorelease];
}


- (NSString*) caption {
    return caption;
}


- (NSString*) photographer {
    return photographer;
}


- (void) setCaption:(NSString *)input {
    [caption autorelease];
    caption = [input retain];
}


- (void) setPhotographer: (NSString *)input {
    [photographer autorelease];
    photographer = [input retain];
}


- (void)dealloc
{
    [self setCaption:nil];
    [self setPhotographer:nil];

    [super dealloc];
}

@end
Run Code Online (Sandbox Code Playgroud)

Enr*_*lio 7

+ (Photo*) photo方法是一个工厂方法,它封装了创建Photo类对象的细节.

工厂方法强制执行封装,并允许请求对象,而不会与创建行为进行不可分割的耦合.

在此特定示例中,工厂方法隐藏的信息是内存管理,因为客户端不需要担心释放返回的对象.

Objective-C API中常见做法是在类中提供工厂方法,以返回相同类的自动释放对象.这些方法不得包含任何单词"alloc","new","copy"或"mutableCopy",根据惯例,它们表示调用者不拥有返回的对象,即它不必须明确发布.

相关资源: