总目录 iOS开发笔记目录 从一无所知到入门
文章目录
- 源码中 NSArray 的构造方法与命名规律
- 自定义类的构造方法命名
- 截图
- 代码
- 输出
源码中 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