前言
使用flutter期间 ,但是还是用到一些原生的,学习一些oc的基础用法。
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
@property (nonatomic, strong) NSString *myString;
- (void)myMethod;
@end
#endif /* MyClass_h */
一、基础数据类型
int myInt = 10;
float myFloat = 3.14f;//(注意要加f后缀来区分double类型)。
double myDouble = 3.1415926;
BOOL myBool = YES;
BOOL myBoo2 = NO;
//对象属性需要用*
NSString *strs = @"OC";//字符串 @"OC"
//打印日志
NSLog(@"hello,world");
NSLog(@"1+1=%d",2);
NSLog(@"%@", strs);//@"%@"是格式化字符串的占位符,用于输出对象(在这里是NSString对象
//数组
NSArray *array = @[@"apple", @"banana", @"cherry"];
//这个方法的参数列表最后必须以 nil 结束,nil 表示没有对象(指针为空
NSArray *fruitsArray = [NSArray arrayWithObjects:@"apple", @"banana", @"cherry", nil];
//这里 [NSNull null] 就占据了数组中的一个位置,而不是像 nil 那样用于结束数组元素列表。
NSArray *fruitsArray2 = [NSArray arrayWithObjects:@"value1", [NSNull null], @"value3", nil];
二、类
OC的类有两个文件,一个.h ,一个.m
1. .h文件
对外公开类的接口,主要是用于向其他代码文件 “宣告” 这个类有哪些属性、方法等成员,是一种对外公开的接口定义。例如:
//导入 Foundation 框架的头文件,这是 OC 开发中常用的基础框架。
#import <Foundation/Foundation.h>
//声明一个名为MyClass的类,它继承自NSObject。NSObject是 OC 中几乎所有类的根类。
@interface MyClass : NSObject
//声明一个属性myString,类型是NSString(OC 中的字符串类型)。nonatomic表示非原子性操作(在多线程环境下性能稍好但不保证线程安全),strong表示是强引用,会增加对象的引用计数,防止对象被过早释放。
@property (nonatomic, strong) NSString *myString;
@property NSString *normalStr;//默认是(atomic,strong)
//声明一个实例方法myMethod,返回值类型是void,即没有返回值。
- (void)myMethod;
//结束类的声
@end
2. .m文件
实现文件用于实现头文件中声明的方法。同时可以用于定义私有成员(属性和方法),对类进行扩展
#import "MyClass.h"
@interface MyClass ()
@property (nonatomic) NSInteger privateCount;
- (void)privateMethod;
@end
//开始实现MyClass这个类
@implementation MyClass
// 实现头文件中声明的myMethod方法
- (void)myMethod {
self.myString = @"Hello, World!";
}
//结束类的实现。
@end
这里的 privateCount 属性和 privateMethod 方法只能在 MyClass 的 .m 文件内访问和使用,对于导入了 MyClass.h 的其他类来说,它们并不知道这些私有成员的存在,无法直接调用或访问,有助于对类内部实现细节的封装,避免外部代码随意干涉类的内部逻辑,提高代码的安全性和可维护性。
属性声明:使用@property关键字,在@interface中声明,如@property (nonatomic, strong) NSString *name;。
属性特性:包括读写控制(readonly、readwrite)、原子性控制(atomic、nonatomic)、语义设置(assign、retain、copy)等。如@property (nonatomic, readonly, copy) NSString *address;表示一个只读且赋值时会进行拷贝的address属性。
属性实现:可使用@synthesize关键字在@implementation中实现,如@synthesize name = _name;,也可由编译器自动合成。
3. 函数方法
调用myString的length方法
NSString *myString = @"Hello";
NSUInteger length = [myString length];
首先方法声明
-号类似成员方法,+类似静态方法
- (ReturnType)methodName:(ParameterType)parameterName;
@interface MyClass()
- (NSString *)stringByAppendingString:(NSString *)anotherString;
- (int)addSelf:(int)num;
- (int)add:(int)num1 and:(int)num2;
@end
方法声明位置:通常在.h头文件中的@interface和@end之间进行声明,用于向其他类展示该类所提供的方法接口。或者在.m文件中@interface和@end之间进行声明用于私有
然后方法调用
[instance methodName:parameterValue];
#import "MyClass.h"
@interface MyClass()
- (int)add:(int)num1 and:(int)num2;
- (int)addSelf:(int)num;
- (NSString *)stringByAppendingString:(NSString *)anotherString;
@end
@implementation MyClass
- (void)myMethod {
NSLog(@"%d",[self addSelf:10]);
NSLog(@"%d",[self add:11 and:12]);
NSLog(@"%@", [self stringByAppendingString: @"oc"]);
}
- (int)add:(int)num1 and:(int)num2{
return num1+num2;
}
- (int)addSelf:(int)num{
return num+num;
}
- (NSString *)stringByAppendingString:(NSString *)anotherString{
return [NSString stringWithFormat:@"My name is %@ ",anotherString];
}
//结束类的实现。
@end
4. 控制流与循环
int num = 10;
if (num > 5) {
NSLog(@"Number is greater than 5");
} else {
NSLog(@"Number is less than or equal to 5");
}
for (int i = 0; i < 10; i++) {
NSLog(@"%d", i);
}
int j = 0;
while (j < 5) {
NSLog(@"Value of j: %d", j);
j++;
}
int value = 5;
switch (value / 2) {
case 1:
NSLog(@"Value divided by 2 is 1");
break;
case 2:
if (value % 2 == 1) {
NSLog(@"Value divided by 2 is 2 and the original value is odd");
} else {
NSLog(@"Value divided by 2 is 2 and the original value is even");
}
break;
default:
NSLog(@"Something else");
break;
}
for (int i = 0; i < 10; i++) {
NSLog(@"%d", i);
}
int j = 0;
while (j < 5) {
NSLog(@"Value of j: %d", j);
j++;
}
int k = 0;
do {
NSLog(@"Value of k: %d", k);
k++;
} while (k < 3);
5. 枚举
/**
typedef关键字用于为这个枚举类型创建一个别名。Weekday就可以像一个数据类型一样使用。枚举中的每个值(如Monday、Tuesday等)都代表一个整数常量,默认情况下,第一个值为0,后面的值依次递增1。所以在这个例子中,Monday的值是0,Tuesday的值是1,以此类推。
*/
typedef enum {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
} Weekday;
/**
自定义
*/
typedef enum {
Red = 1,
Green = 2,
Blue = 4
} Color;
//使用
Weekday myDay = Wednesday;
[self printWeekday:myDay];
Color objectColor = Red | Blue;
- (void)printWeekday:(Weekday)day {
switch (day) {
case Monday:
NSLog(@"It's Monday");
break;
case Tuesday:
NSLog(@"It's Tuesday");
break;
// 其他case分支
default:
NSLog(@"It's another day");
break;
}
}
6. 继承
#import <Foundation/Foundation.h>
@interface Animal : NSObject
@property (nonatomic) NSInteger age;
- (instancetype)initWithAge:(NSInteger)age;
- (void)makeSound;
@end
@implementation Animal
- (void)makeSound {
NSLog(@"Animal makes a sound");
}
- (instancetype)initWithAge:(NSInteger)age {
self = [super init];
if (self) {
self.age = age;
}
return self;
}
@end
@interface Dog : Animal
@property (nonatomic) NSString *breed;
- (instancetype)initWithAge:(NSInteger)age andBreed:(NSString *)breed;
@end
@implementation Dog
- (void)makeSound {
NSLog(@"Dog barks");
}
- (instancetype)initWithAge:(NSInteger)age andBreed:(NSString *)breed {
self = [super initWithAge:age];
if (self) {
self.breed = breed;
}
return self;
}
@end
7. 构造函数
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
- (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age;
+ (instancetype)personWithName:(NSString *)name age:(NSInteger)age;
@end
@implementation Person
- (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age {
self = [super init];
if (self) {
self.name = name;
self.age = age;
}
return self;
}
+ (instancetype)personWithName:(NSString *)name age:(NSInteger)age {
Person *person = [[self alloc] init];
person.name = name;
person.age = age;
return person;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person1 = [Person new];
NSString *n = person1.name;
// 使用自定义初始化方法创建Person对象
Person *person = [[Person alloc] initWithName:@"Alice" andAge:25];
NSLog(@"Name: %@, Age: %ld", person.name, (long)person.age);
//静态方法
Person *newPerson = [Person personWithName:@"Bob" age:30];
}
return 0;
}
8.单例
#import <Foundation/Foundation.h>
@interface MySingleton : NSObject
+ (MySingleton *)sharedInstance;
@end
@implementation MySingleton
static MySingleton *sharedInstance = nil;
+ (MySingleton *)sharedInstance {
if (sharedInstance == nil) {
sharedInstance = [[self alloc] init];
}
return sharedInstance;
}
@end
后记
这些应该足够基础开发了,后续遇到问题了再新增