Objective-C 构造方法的定义和声明规范

总目录 iOS开发笔记目录 从一无所知到入门

源码中 NSArray 的构造方法与命名规律

在这里插入图片描述

@interface NSArray<ObjectType> (NSArrayCreation)

+ (instancetype)array;
+ (instancetype)arrayWithObject:(ObjectType)anObject;
+ (instancetype)arrayWithObjects:(const ObjectType _Nonnull [_Nonnull])objects count:(NSUInteger)cnt;
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)arrayWithArray:(NSArray<ObjectType> *)array;

- (instancetype)initWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;

/* Reads array stored in NSPropertyList format from the specified url. */
- (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url error:(NSError **)error  API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
/* Reads array stored in NSPropertyList format from the specified url. */
+ (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) NS_SWIFT_UNAVAILABLE("Use initializer instead");

@end

可以看出,一个类型中,用于返回一个该类型对象的方法(不止是构造方法)的命名规律为以下(其中Xxx表示具体的类名):

  • 方法的返回值可以从 (Xxx *) 变成 (instancetype) ,其中instancetype在该类中表示该类的实例类型。加nullable表示方法的返回值可为空。
  • +开头的类方法的命名:xxx xxxWithArg1: arg2: arg3...
  • -开头的对象方法的命名:initWithArg1: arg2: arg3...

自定义类的构造方法命名

按照上述规律,自定义类,代码如下:

截图

Person类定义:
在这里插入图片描述
main方法调用部分:
在这里插入图片描述

代码

//
//  main.m
//  构造方法
//
//  Created by wuyujin1997 on 2023/2/23.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject {
    
    
    @public
    NSString* name;
    int age;
}
+ (instancetype) person;
+ (instancetype) personWithName:(NSString*)name age:(int)age;
- (instancetype) initWithName:(NSString*)name age:(int)age;
@end

@implementation Person
+ (instancetype) person {
    
    
    return [Person new];
}
+ (instancetype) personWithName:(NSString*)name age:(int)age {
    
    
    Person* person = [Person new];
    person->name = name;
    person->age = age;
    return person;
}
- (instancetype) initWithName:(NSString*)name age:(int)age {
    
    
    self->name = name;
    self->age = age;
    return self;
}
// description方法用于改写打印本类对象时的输出内容格式,类似于 Java 中的 toString() 。
- (NSString *)description {
    
    
    return [NSString stringWithFormat:@"<%@:%p> name:%@ age:%d", [self class], self, self->name, self->age];
}
@end

int main(int argc, const char * argv[]) {
    
    
    NSArray* arr1 = [NSArray new];
    NSArray* arr2 = [NSArray array];
    NSArray* arr3 = [NSArray arrayWithArray:arr1];
    
    Person* p1 = [Person new];
    Person* p2 = [Person person];
    Person* p3 = [Person personWithName:@"wuyujin1997" age:26];
    NSLog(@"%@", p1);
    NSLog(@"%@", p2);
    NSLog(@"%@", p3);
    [p1 initWithName:@"测试赋值" age:22];   // 已有对象,只是调用 initXxx 方法去做属性值的赋值/初始化而已。
    NSLog(@"%@", p1);
    return 0;
}

输出

2023-02-26 20:02:19.759434+0800 构造方法[29043:905161] <Person:0x6000002033a0> name:(null) age:0
2023-02-26 20:02:19.759661+0800 构造方法[29043:905161] <Person:0x600000203400> name:(null) age:0
2023-02-26 20:02:19.759684+0800 构造方法[29043:905161] <Person:0x600000203460> name:wuyujin1997 age:26
2023-02-26 20:02:19.759704+0800 构造方法[29043:905161] <Person:0x6000002033a0> name:测试赋值 age:22
Program ended with exit code: 0

猜你喜欢

转载自blog.csdn.net/wuyujin1997/article/details/129230406